Feature/net http errors

* Implements an errors hierarchy for non successful http responses
* Net Http requests raise the appropriate error from the errors hierarchy if the response is one that is not classed as successful 

* related to #106 
Hey @apotonick the idea with the translations is two fold.

1. it gives more information about the actual problem at the end-point allowing the consumer to respond accordingly
2. it provides a transport agnostic layer of abstraction, allowing consumers to change transports without having to change any of there error handling code, we just need to ensure that each transport raises the same hierarchy of errors with a similar implementation in each.