Remove the allocating functor operator()s

They are done now by passing a (default) null pointer to the other operator().
This also means the operator() has more choice over what to do with it.
Unify the calling convention for the array()s

So we can then get the array()s to do something different depending on whether
they are overwriting or creating new arrays.  There are some asserts to enforce
the current shortcuts too.