Define message protocols and tools for reading and writing messages
The reader and writer traits are async fn in a public trait, which cannot
state its auto-trait bounds. That is deliberate: these are only ever awaited
on the connection task that owns the stream, never sent across one.