WIP: Add "targets" keyword to @local-wrapped functions.

Hangs!
Merge branch 'odin' into feature/odin.local-targets-keyword
Merge branch 'feature/push-func-names' into feature/odin.local-targets-keyword

Conflicts:
	distarray/odin.py
	distarray/tests/test_odin.py
Go back to using a `context` keyword.

The `targets` keyword didn't work out with MPI.
Rename subcontext test.
Determine `@local` function context from DistArrayProxies.

... instead of requiring / allowing users to explicitly use a `context` keyword when using functions wrapped using `@local`.

Also, add some utility functions to help with this, including `all_equal` (which determines if all elements in an iterable are equal) and a function `determine_context` which does the main work for this change.
Add tests for new subcontext functionality.

Also add tests for supporting utility functions.
Test MPI calls in a subcontext.
FIX: Raise ValueError when contexts mismatch.

For now, we restrict all contexts for function decoration with @local
to match the contexts of DistArrayProxy objects.

For MPI collective operations, this guarantees that the communicator
used at definition time and at runtime are identical, ensuring that
collective operations (like barrier, for example) won't hang.
Merge branch 'odin' into feature/odin.local-targets-keyword