Shuffle-based plans for Grappa

This PR implements `GrappaShuffleHashJoin`, which looks like
distributed shuffle by hashed key + local join.

- corresponds with changes merged into https://github.com/uwsampa/grappa/tree/bmyerz-grappalog-master at a0d19c7
- Issues: This is implemented in one operator in the Grappalang style. Ideally this partitioned type of operator might actually be decomposed. It would use parts of the distributed IR embedded in `MyriaAlgebra`, like `MyriaShuffle`.
- [ ] BUG: declares a new tuple type for iterating over join result (test case Q9)