Previously it worked on ClusterSpec, but that means we can't read the
labels or annotations. We want to use those labels/annotations to
experiment with new cloud providers (e.g. bare metal) before adding
this to the API.
Introduce generics so we also get type-safety.