There are two use cases that are currently mixed when using LegacyValues:
1) Legacy classes use LegacyValues to pass to the new interface 2) User wants to attach indices to the passed primitives without constructing them themselves
The difference is that 1) should not be exposed to a user, while 2) is intended to.
With the introduction of the RangeTraits in the future, the use cases diverge: 1) will still use AccessTraits for backwards compatibility, while 2) will switch to using RangeTraits.
This patch separates the two. They still share a lot of commonalities at the moment, but that will change with RangeTraits.
In addition, the order is swapped between value and index in the struct. The reason being is that it is easer to align an index (likely 4-byte int) than a value (which could be a 12-byte point, 24-byte box, or whatever).