CDK-488: Add TaskUtil.partition.

This utility method regroups a PCollection using a specified number of
reducers. This can be used to control the number of files created by a
copy job. The number of reducers is approximately the number of files
produced, but at least one file per partition will be created.

This is implemented in two ways. If the dataset is partitioned, the
entities are grouped by partition key so that each partition is handled
by one reducer and the number of files created is minimized. If the
dataset is not partitioned, this will perform the regroup operation
using the entities themselves as keys to produce the right number of
files, one per reduce task.
Good catch. The test does run in a MRPipeline, at least for me. The problem is that the job only runs with one reduce task regardless of how many I set in crunch. The fix is to use a MiniMRCluster (where it runs correctly, with the file check), but it looks like those have changed so it will take some work to get it working under all test profiles. I'd rather not hold up this commit on it, but I'll wait until you have a chance to take a look.