Block redistribution

Working implementation of block (and no-dist) redistribution.

Two main cases:

* global shape preserving redistribution, and
* reshaping redistribution.

Both cases support redistribution on a different set of targets.  The source and destination targets can be identical, overlapping, or disjoint.  

Some small performance optimizations are implemented, but there is much room for improvement.   This version just gets general redistribution working; future work will need to address performance and optimizations.
Test of a couple of error conditions would be nice.  I assume you get a "Distributions not compatible" error if the shapes don't match up?