Don't convert back to TypedPipe from KeyedList until needed

This does not automatically go back to TypedPipe after a reduce, so you can first reduce, then join. Makes making efficient joins easier to write.

The next thing I want is to be able to join joined things (so, .join(CoGrouped)). I think I know how to do this.  That should pretty much fix up the ability to join + reduce arbitrarily in one MR pass.