Refactor `from_localarrays` to take a distribution

... optionally, instead of grabbing distribution information from the engines.  Also add an optional `dtype` kwarg so that can be passed in instead of pulling it from the engines.
Be more explicit about new from_localarrays call.
Fix an API irregularity and a bug in client_map...

1. `dist` should be optional, with a default value of `None`, as discusses
2. `make_grid_shape` takes a dist_tuple, not an arbitrary dist.   The normalized dist (that is, a tuple), self.dist,  wasn't being passed in here, the raw `dist` was.
Add a type check to `make_grid_shape`.

Accidentally passing a dictionary into here has bitten me too many times.  Apparently enumerate works on a dict, so an error won't be thrown here without the explicit check.
Fix a bug in Distarray.from_localarrays.

It didn't actually work when dtype was left None.
Modify Random.rand to use the new from_localarrays

... API.
Whitespace.
Modify Random.normal to use new from_localarrays
Modify Random.randint to use new from_localarrays
Modify Random.randn to use new from_localarrays
Add a function to fill in missing dim_data keys

... for the 'n' dist_type.
Use Distribution objs with from_localarrays...

Now for functions that take a dim_data_per_rank.
Use new version of from_localarrays in unary_proxy
Use new version of from_localarrays in binary_proxy
Merge branch 'master' into refactor/fix-distribution-from-dim-data-per-rank

Conflicts:
	distarray/metadata_utils.py
Merge pull request #354 from enthought/refactor/fix-distribution-from-dim-data-per-rank

Fix `Distribution.from_dim_data_per_rank`