stream: Fix incorrect error throw when pipe'ing

Specifically, if an error listener is attached to a stream _before_ it is piped
to, _and_ it cleans up efter itself by removing the error listener, the pipe
logic will miss this and throw as if it was unhandled.

The solution adds a shadow '_error' event that will be emitted on any error.