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.
User reports of kubelet flags not being passed; moved more to code.
Also found & fixed the likely root-cause issue: we have two copies of
the cluster spec and were not being precise about which one we wanted to
use at all times.