This gives better asserts in debug builds through use of Span, more safety when name convention attributes happen to have different types or domains, and simpler code in some cases. But the main reasoning is to avoid relying on the specifics of CustomData more to allow us to replace it in the future.