refactor

This refactors `Reader`, moving all "connection" responsibilities into `AsyncConn` so it can be re-used across `Reader` *and* `Writer`.

It introduces events on `Message` and `AsyncConn` for cleaner separation and testability (replacing the monkey patching we previously did on `Message`).

It should now be possible to easily use the low level protocol and connection objects outside of `Reader`.

This was inspired by the work @dudleycarr has been doing on https://github.com/dudleycarr/nsqjs