code: func (s *secureSession) runHandshake(ctx context.Context) error {
  	defer log.EventBegin(ctx, "secureHandshake", s).Done()
  
  	result := make(chan error, 1)
  	go func() {
  		// do *not* close the channel (will look like a success).
  		result <- s.runHandshakeSync()
  	}()
  
  	var err error
  	select {
  	case <-ctx.Done():
  		// State unknown. We *have* to close this.
  		s.insecure.Close()
  		err = ctx.Err()
  	case err = <-result:
  	}
  	return err
  }
docs: // runHandshake performs initial communication over insecure channel to share
  // keys, IDs, and initiate communication, assigning all necessary params.
  // requires the duplex channel to be a msgio.ReadWriter (for framed messaging)