Fixes bugs and testsuite when running on n > 4 engines.
Fixes testsuite to run on fewer than 4 engines.
Make uid depend on randomstate
Push random state to engines, and change apply execution environment.

When apply is called it gets the random state from the client and sets
it on all the engines. So their uid generation is synchronized.

We also change the `__globals__` attribute on the apply'd function. So
that it executes in the `__main__` environment on the engines.
Add proxyize function to the engines.

This function stores a value and returns the name that can be used to
access it.
Add tests for new proxyize functionality.
Remove apply's return_proxy kwarg

This is is so that proxyize can be used.
__import__ -> importlib.import_module
Give Distarray its own random.Random instance
Don't copy the engines dict.
Replace proxyize function with a class. Change name generation.

Names generated by proxyize are of the form __distarray__<client
nonce><integer> where the integers grow consecutively.
Fix rebase errors.
Fixe bug setting proxize's state with nonce.
Remove obsolete return_proxy use.
Merge pull request #379 from cowlicks/apply-proxy

Enhancements to `Context.apply`
Reduce roundtrips for distarray functions.

Distarray functions now take 1 roundtrip per engine.
__import__ -> importlib.import_module in functions.py
Fix bug wth all 'n's dist tuple.

Also refactor make_grid_shape. Combine validate_grid_shape and
normalize_grid_shape. Add regression test. A fix a few style faux pas.
Fix bug in testing.

DistArray.var/std return a DistArray instead of an int.
Raise NotImplementedError for reductions with empty localarrays.

Temporary fix for reduction edge cases.  Better solution coming.