func DialConnContext(ctx context.Context, client Requester, props *SessionProps) (*Conn, error) {
	if !props.Initiator {
		return nil, errors.New("when dialing the connection has to initiate the handshake")
	}
	session, err := NewSession(props)
	if err != nil {
		return nil, err
	}
	conn := &Conn{
		client:  client,
		session: session,
		in:      bytes.NewBuffer(make([]byte, 0, 512)),
		out:     bytes.NewBuffer(make([]byte, 0, 512)),
	}
	if err := conn.doHandshake(ctx); err != nil {
		return nil, err
	}
	return conn, nil
}
DialConnContext creates a new connection and completes the handshake with the
remote endpoint. If the handshake fails the Dial will also be
considered failed
package noise
import (
	"bytes"
	"context"
	"errors"
	"io"
)
type Requester interface {
	Request(context.Context, io.Writer, io.Reader) error
}
type ClientFunc func(context.Context, io.Writer, io.Reader) error
func (fn ClientFunc) Request(ctx context.Context, w io.Writer, r io.Reader) error {
	return fn(ctx, w, r)
}
type Conn struct {
	client  Requester
	session *Session
	in  *bytes.Buffer
	out *bytes.Buffer
}