Add pipe1.join(pipe2) syntax in TypedAPI

@vitalyg (and others) have argued that doing: `pipe1.group.join(pipe2.group)` is quite ugly. This change adds an implicit to `HashJoinable` which is a subclass of `CoGroupable`. This means that you can join `(K, V)` pipes without any extra implicit.

This seems safe since the only methods added by the enrichment are the join ones (not the reducing methods on KeyedListLike).

Please speak up if this looks at all dangerous (as implicit conversions can be when poorly designed).
yep, fair enough. it also moves to the newer .withReducers code paths too.