New array

This replaces the existing array with one where the memory management is done by shared pointers.

The Array is simply a wrapper for a shared pointer to an object of type _ArrayMemory.

_ArrayMemory can either wrap existing memory, or allocate it's own.  It uses std::vector to allocate it's own memory.

This passes all the existing c++ tests, but we should be careful about accepting this pull request