As you say, you could have several array views referring to the same block.  Those views could all be to disjunct parts of the block, and they could even be in different data types.  So, yes, you could "cram" multiple arrays into a block.  The simplest approach to memory management is that a block "lives" as long as there is any array view looking at it, so in that case, you could end up retaining parts of the block that are no longer needed.  You could have a routine that removes the unused chunks and adjusts the offsets of the views accordingly, but that's still tricky to do in the general case, particularly if any of the views are non-contiguous.  But having array view semantics always has these sorts of problems...

I didn't think it was worth the extra complication of having a two-tiered design: one layer to get at the concrete data and then one layer for views.  In the present design, everything is a view, and the data lives as long as there is a view pointing to it.