Allow Distribution and DistArrays on subset of targets

This PR adds a `targets` attribute to `Distribution` objects, allowing Distributions and DistArrays to exist on a subset of targets.  All communication methods are updated to reflect the change.

On the local side, it is necessary to create a sub-communicator for each grouping of sub-targets.  These sub-communicators are cached in the client-side context object to reduce overall communication.

Sub-target support is a necessary prerequisite for reduction methods and for certain slicing operations.