Add in a BadResponse error for HTTP 400/500

- Easier to rescue than a RuntimeError
- Adds a handle_unknown_response_error method for easier overriding