Design philosophy:

There are 2 fundamental reasons for tiling: physics and performance. Both of these
may require multiple levels of tiling hierarchy. Unfortunately, it may not be trivial to decouple or overlap
the two hierarchies. Thus we eschew the arbitrarily-deep tiling hierarchy in favor of a single level of tiling.
(N.B. customization of the tile types is possible, and thus can be used to create hierarchies of tiles)
This design decision is driven by the following considerations:
1) the end user should not worry about tiling for performance, the interface should be focused on the needs of
domain application (quantum physics).
2) tiling in quantum physics corresponds to spatial/energetic locality (outside local domains interactions
are classical and do not require operator matrices) or symmetry (not always worth it, point group symmetry
conflicts with the "local" tiling).
3) the problem of tiling for performance is challenging and has been only solved for simple cases and regular memory
hierarchies (e.g. BLAS). We must rely on external libraries and should optimize only at a high level and without
impact on interface (e.g. tile fusion, etc. to construct data representation most suitable for performance).
4) item 2 also suggests that nonuniform(irregular) tiling must be allowed to provide the necessary flexibility for physics.
5) repacking arrays (i.e. changing tile sizes, permuting dimensions, etc.) will be frequent, but OK.

