Split TypeMeta into ObjectMeta/ListMeta

Splits TypeMeta into TypeMeta, ObjectMeta, and ListMeta, and implements the correct references and initializations of the object.

Extracted from #1600
Repeat said comment here