A session typed channel. P is the protocol and E is the environment,
containing potential recursion targets. R is the representation of
messages, which could be DynMessage, or perhaps something we know
statically how to turn into JSON or bytes.
Define for the wire representation, so that the raw messages can be lifted into it,
and later the representation can be cast back into the expected types.
Similar to session_channel; create a typed channel for a protocol P,
but instead of creating a channel for its dual, return the raw sender
and receiver that can be used to communicate with the channel created.
We can use a dynamic boxed message to pass messages, and represent all messages in a protocol as individual structs.
However if we want to send them over a network connection we will need to serialise to some wire format, and at that
point we have to use tagging, so we can recognise what type to deserialise into.