Preserve array order

Using step-by-step "fancy indexing" to mimic orthogonal indexing leaves the final array with an unexpected order. This PR avoids this by using `np.take(..., axis=...)` instead.

Each fancy-indexing operation creates a new array with the fancy-indexed dimension moved to the front. Then NumPy takes a view of this new array to move the fancy-indexed dimension back to where in belongs.