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).
You could do this enrichment, but you had to explicitly import it. That is another way to go, just make this class what we enrich to. It more narrowly constrains the enrichment.

That said, it seemed like HashJoinable was the right place to jump in, since we also want `pipe1.join(pipe2).join(pipe2)` type syntax.