Making Zookeeper integration code more readable.

I've been re-visiting the zookeeper code. Initially I was looking into it because it wasn't working (it turned out java version compatibility issue), but I got better understanding of the code and wanted to make it more organized.

* Making more variables into `final` so that the state modification is more controlled.
* Adding comments in various places, especially regarding the lock states.
* Adding zookeeper bootstrapping to the test suite, and moving the test out of the integration test (in fact, this test was blacklisted and was never executed).
* Reducing the usage of the mockito whitebox.
* Reducing the amount of shared states, by pulling the scavanger state out of the member variable and storing it within the function scope.
* Removing the usage of `java.util.Timer`.
* Separating out the zookeeper connection wait outside the constructor - that makes the tests more reliable, since having the lock managers in disconnected state is most likely bad.
doing performance-based coordination is probably very hard (how do we map the multi-dimensional resource usage metrics to a single dimensional "how much load should it take), and unnecessary complexity IMO. I feel like even enforcing each nodes to have `128/N` shards is probably good start, instead of taking 50%.

I commented on the chat, and i think it's possible to implement this using ZK ephemeral nodes. whenever rollup server joins, it makes a ephemeral node, and this allows you to figure out the `N` to determine `128 / N` - the number of shards it should own.