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 don't like the way we propagate `result.getError()` here, as though the exception happened in this thread. If the repeater was executed in this thread, it's almost ok (except we lose some context of what called `WaitForRepeaterCallable.call`). If it's a different thread, then it's a bad idea to just throw the exception this thread, rather than wrapping it in something equivalent of an `ExecutionException`. For example, if that particular thread was interrupted then it doesn't mean we should interrupt this thread by re-throwing the exception!

The same applies to `ReferenceWithError.get()`.