address comments:

1. make SameKey can be iterable multiple times
2. make SameKey picklable
3. more tests
4. mapPartitions() with preservePartitions=True