Array creation takes a distribution object

Refactor the client-side array-creation methods to take a `Distribution` object instead of the `shape`, `dist`, `grid_shape` arguments directly.  A user can create a `Distribution` object many ways, including with those arguments.  This allows all array-creation routines to create all of our supported distribution types.

It is a little verbose at the moment, but we may add a more convenient "make up a distribution for me" API in the future.