Return clearer error types for various failure conditions

- Return HttpErrors for non-200 responses from the API
- Return ApiParseErrors for responses which are in an unparsable/parseable but unexpected format
- Return ApiErrors for valid error responses (status === 'error')