abstract out NetworkStreams

@reem here's what I'm thinking to support arbitrary underlying Streams. Being generic removes the hit of a dynamic lookup, but can also be less ergonomic. Though, with the default type parameters, a `Server`, or `Request`, etc can still be used, with `HttpStream`s.

fixes #5