This lets us use labels (or annotations), meaning we can experiment
with different clouds without changing the API.
We also add initial (experimental/undocumented) support for exposing a "Metal" provider.
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.