Instead of having two full specializations for std::array, factor the
common code into an helper class. I was careful not to change the
behavior of std::array, especially ABI wise.
The only purposeful functionality change is that when the debug mode is
enabled, accessing a non-empty std::array out-of-bounds will _LIBCPP_ASSERT,
which seems like an improvement.
Do we use a __detail namespace anywhere else? I don't have an issue with it but, it seems a bit out of place.