Refactor the ndarray adaptor and expose the array flags

This uses a cleaner pattern in the C implementation, instead of computing all pointers by hand.
I thought about putting llarray substructure at the end.  That would work, given that Numba always passes structures by pointer.  A simple offsetting would do.

The biggest user of llarray is probably the Numba GPU backend.  In fact, llarray is designed to work well on the GPU where we want to minimize to-device transfer.  For things like nitems, we can easily compute that by ``np.prod(arr.shape)``.  Given that we pass the llarray structures by value and they are immutable, it is likely that LLVM can avoid recomputing subsequent ``.size``.

As for other users, there are people interfacing with Numba generated CUDA code from CUDA-C/C++ code.  But, I don't know if they uses the llarray.