Type-level list support

This means that you can have an arbitrarily large number of dimensions and it doesn't have to be supported by tuples of ever-increasing size.  The tuple instances are still present, of course, and the resulting in-memory array is identical no matter which style you use.