code: func (k *Kite) GetKey() (string, error) {
  	if err := k.SetupKontrolClient(); err != nil {
  		return "", err
  	}
  
  	<-k.kontrol.readyConnected
  
  	result, err := k.kontrol.TellWithTimeout("getKey", k.Config.Timeout)
  	if err != nil {
  		return "", err
  	}
  
  	var key string
  	err = result.Unmarshal(&key)
  	if err != nil {
  		return "", err
  	}
  
  	k.configMu.Lock()
  	k.Config.KontrolKey = key
  	k.configMu.Unlock()
  
  	return key, nil
  }
docs: // GetKey is used to get a new public key from kontrol if the current one is
  // invalidated. The key is also replaced in memory and every request is going
  // to use it. This means even if kite.key contains the old key, the kite itself
  // uses the new one.