Update make_shared for arrays to address 2070

This updates make_shared and allocate_shared for arrays in accordance with
report 2070 which requires that allocator_traits<A2>::construct(a2, ptr,
...) is used for construction and allocator_traits<A2>::destroy(a2, ptr)
is used for destruction instead of placement new and destructor
invocation.

It also refactors the code heavily, consolidating allocate_array_helper
and make_array_helper class templates into class template array_allocator.
Both array_allocator and array_deleter class templates have partial
specializations for when allocators are in play and store the allocator
instance accordingly. The array utilities for construction and destruction
are now consolidated within the array_deleter class template from which
they were always invoked anyway.