Split send receive refactor

Refactoring to an explicit decorator chain to facilitate adding features (like out-of-order-detection) more easily.
Removed separate formatter - formatting is done differently by individual layers.
Using events rather than callback to pass received messages back - events fit better when things happen more than once.