Move ArrayHandleRuntimeVec metadata to a separate class
Originally, the metadata structure used by the ArrayHandleRuntimeVec
storage was a nested class of its Storage. But the Storage is
templated on the component type, and the metadata object is the same
regardless. In addition to the typical minor issue of having the
compiler create several identical classes, this caused problems when
pulling arrays from equivalent but technically different C types (for
example, long is the same as either int or long long).