make errors returned actual Errors, not strings

Makes errors returned in callbacks actual `Error` instances, not strings. This way there's a stack trace captured, which makes figuring out where the error came from, *somewhat* easier. Also it attaches the body to the error, or any helpful information.

Also it attaches a handler for the `error` event emitted by the https response.