Handle errors emitted from the source read stream

The current implementation handled errors when `_createReadStream` throws an
error or the output pipe emits an error, but did not handle errors emitted from
the stream returned from `_createReadStream`.

Since the error handler was never called in this case, the temporary file
wouldn't get cleaned up. This caused subsequent read requests to think that
someone else was still writing to the temp file, and they'd wait forever.

Added test cases that check for this behavior.