test: Test for throwing behavior on 'error' emits
events: Emit '__error__' on 'error' events

Essentially, this enables attaching a hidden listener to the 'error' event
that doesn't effect the throwing behavior by attaching to '__error__'.
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.

Fixes #4155.