engine: add partitioning based on unit count

This reworks the partitioning framework, simplifying it dramatically in light
of the new engine reconciler model. It also implements functional partitioning
of the cluster based on the recently-added LoadedUnits count in MachineState.
```
return &cluster{
  machines: make(map[string]*machine.MachineState),
}
```