Fix implementation of core::array

Previous implementation was using list initialization which implied an
extra copy. This was problematic as core::array is used for ndarray
indexing. Using the aggregate constructor prevents the issue, but it is
incompatible with inheritance (has confirmed by @jfalcou).

Has the implementation of std::array is straight forward, I duplicated it
in our code and extended it. Note that this is motivated by a huge
performance gain (+30% speedup on some benchmarks).