Composable Joins in the Typed-API

This is a big change, but it adds a long missing feature: composing joins
into one MR job. This enables three(and more)-way inner/outer/custom joins.

I think there needs to be some polishing and refactoring KeyedListLike,
Grouped, CoGrouped, ReduceStep, etc... Lots seem redundant, but I'd
like to get this big merge in before doing too much of that.