Refactor StateChanges into a tree of IStageChange providers - fixes 361

Fixes #361.
Does this test really demonstrate that the changes are run in parallel? I'd have thought it would be better demonstrated by asserting that the second change has been run despite the first change pending.