Move recursive aggregation from _pipeline to pipeline_of_streams

Previously, each implementation of _pipeline was responsible for recursively calling _pipeline on
the streams it returned. This led to repeated logic in multiple _pipeline methods, which was verbose
and error prone.

Now the recursive call is made in pipeline_of_streams. In addition, _pipeline methods are not
expected to return the stream itself, only the streams piped to it.

To reflect these changes, _pipeline's name is changed to _piped_streams.
combine: add _pipeline so streams will have error handling

Previously, anytime streams passed to combine would throw or emit an error, the error would not be
caught. This change ensures that the streams passed to combine will have error handlers added to
them by Understream's run function.