Exchange callbacks for events/observables

Rather than passing callbacks, expose events for connected, disconnected, received, and sent. These can be consumed as events or as `IObservable<'T>`. See `HttpServer` for an example.

**NOTE: This PR builds upon #33**