Bmyerz grappa shuffle

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)

Replacement for #218 

Reissue of #234, except that it's into master instead of a different branch.