I also had to bring packet serialization/deserialization
back out of PacketFormat so that I could make it a trait object
in the connection (before it was generic over PacketMap).
However, now that Connection abstracts over PacketFormat,
it actually reduced code duplication to do so.
I also reorganized the hierarchy a bit, moving packet formats
under the connection module and most other things under the
protocol module.
* Packet header/stream stuff is now defined by a PacketFormat.
* Actual packet serialization/deserialization is handled by
PacketSerializer/PacketDeserializer.
* The end API is still awkaward, so more work is needed.