Refactoring to exhibit a "Protocol" trait and a "Transport" trait

This allows to separate low level transport handling from protocol logic.
Stuff like congestion or maybe encryption are manageable at the transport
level. Things like ping request handling with timeout management goes to
the protocol level.