Refactor HTTP error reporting

- `APIError` class extends `HTTPError`
- Custom error string logic moved into `APIError.__init__()`
- Conveniences: `explanation`, `is_client_error()`, `is_server_error()`
- Strip trailing newline from explanation
Call _raise_for_status every time we make a request
Enable overriding of APIError explanation. Override explanation for missing image in run().
Remove custom error code handling
Remove redundant status code check from _result()
Implement top()
Implement client.copy(), which works much like export()