refactoring solver code to be more generic with the introduction

of a ClusterLayoutChange, which can apply some sort of change
to a ClusterLayout. Currently only an AddServicesChange is
implemented, but we can add ones for removing a service or adding
nodes in the future. Also changing the solver interface a bit
to return a diff of cluster layout when adding services to an
existing layout.