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.
If it's across thread boundaries or even in the same thread but far away then I think I agree with you.  But here the `throw` is just a few lines after the method call which originally threw and caught the exception.

What would be the right solution?  Some sort of `Exceptions.propagateFromExecution(exception)` which you invoke if not in the original thread context and which throws an `ExecutionException` (and does not interrupt the current thread)?

Since this is all same thread can we keep this code and in another PR address the places where we blithely do `Exceptions.propagate` across thread boundaries?