Refactor StateChanges into a tree of IStageChange providers - fixes 361

Fixes #361.
This seems like a good change. Demonstrates that the `SetProxies` is explicitly empty rather than because of the local state.