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
Maybe comment that ListMeta and ObjectMeta are mutually exclusive?