Add exceptions that return more information about client & server errors

 - any 400/500 response will generate an exception instead of returning null
 - any non 400/500 response will return a response
 - should 300's be considered?
simplify throws clause