Update to the Error hierarchy to distinguish between network and protocol errors

Add NetworkError in the Error Hierararchy and make all errors raised by Socket
and Connection descend from it.

Add ProtocolError in the Error Hierarchy and all errors that are from the
Request and Repsponse classes descend from it.

This allows for users of the library to make decisions and based upon if there
is an issue with the network versus an issue with the kestrel server or client
code itself.

Closes #19