add "shuffle" method

Would be useful to have "shuffle" which ensures rows are in random 
order -- so future `take` and `foldLeft` operations get random data
Looking for guidance on implementation: 
- should reducers be implicit (so one calls shuffle(){ _.reducers(50) } ?)
- should refactor groupRandomly to rely on modified shuffleAux?
- should seed be implicit?
- does grouping by shard, as in groupRandomly guarantee that each 
reducer gets one shard?