Brooklyn node and cluster upgrade

Merges #266 (cluster upgrade) with work I've been doing on node upgrade.

Builds on #260 so please ensure that is merged first.

Needs further testing (by me at this point) but wanted to push it in case @neykov you have comments, especially on the last commit.
I can see why you're doing this, but it does make code harder to test and makes it tightly coupled to a particular mode of usage, which doesn't feel good.
The name of the class does suggest that it will be inside a task though!
I'm fine with leaving as-is.