Allowing custom allocators for CpuStorage
This isn't so much a feature request, more an attempt to gauge the level of interest in working on something like this (plus an offer to help with it).

I am currently thinking through how to implement something like [Fortran Coarrays](https://en.wikipedia.org/wiki/Coarray_Fortran) for parallel programming in Nim.* Ideally these could build on top of Arraymancer tensors (although they'd be in an independent library). However, in order to achieve the "Parallel Global Address Space" memory model, I would need to be able to allocate tensor memory using specialised routines provided by low-level communication libraries written in C.

So my question is whether there would be interest in providing some means for the user to specify a custom memory allocator for `CpuStorage`. I haven't completely thought through how to achieve this yet. Perhaps `Tensor` could be made generic on the storage type as well as the element type, although that might look rather messy for those just wanting to use the default allocator.

This could have uses well beyond a coarray library. It would allow experimentation with different types of allocators (as has been suggested in #112) and could allow the user to choose the one most appropriate for their task.

*While libraries already exist for multithreading (shared memory parllelism), I don't know of any which provide for distributed memory parallelism. Shared memory can currently only do of order 100 processors, but some tasks require thousands of cores and must therefore use distributed memory parallel technologies. Of these, the most widely used is MPI, but this is a difficult programming model to work with. Parallel Global Address Space models, such as Fortran's coarrays are conceptually and syntactically much simpler.