func New(id []byte, sharedKey Key, keyPair DHPair, storage SessionStorage, opts ...option) (Session, error) {
	state, err := newState(sharedKey, opts...)
	if err != nil {
		return nil, err
	}
	state.DHs = keyPair
	session := &sessionState{id: id, State: state, storage: storage}
	return session, session.store()
}
New creates session with the shared key.
package doubleratchet
import (
	"bytes"
	"fmt"
)
type Session interface {
	RatchetEncrypt(plaintext, associatedData []byte) (Message, error)
	RatchetDecrypt(m Message, associatedData []byte) ([]byte, error)
	DeleteMk(Key, uint32) error
}
type sessionState struct {
	id []byte
	State
	storage SessionStorage
}