Prototype of llvm.ArrayType-backed array.

As opposed to current array implementation, this type must have all dimensions
fully defined. Because array is one value, it is also an aggregate and can be
returned by value.

This will eventually replace the current Array type and Slices will be used
whenever one or more dimensions can vary at run time. It should be noted that
there are still some performance problems with Slices due to pointer aliasing.
Perhaps it will make sense to keep current Array type as something like
FastSlice until those are resolved.