Rewrite to use the pure JS zookeeper client library

- [x] Fix tests 
- [x] travis 
- [x] the vm

> The purejs `node-zookeeper-client` does throw when some unexpected things happen so some `try`s are probably needed in here.

^ This is not plausible unfortunately. There are about 40 places where this can throw if zookeeper does something unexpected. Not sure how much of an issue this is.
http://zookeeper.apache.org/doc/trunk/recipes.html#sc_recipes_Locks


> Clients wishing to obtain a lock do the following:

> Call create( ) with a pathname of "_locknode_/guid-lock-" and the sequence and ephemeral flags set. The guid is needed in case the create() result is missed. See the note below.
> Call getChildren( ) on the lock node without setting the watch flag (this is important to avoid the herd effect).
> If the pathname created in step 1 has the lowest sequence number suffix, the client has the lock and the client exits the protocol.
> The client calls exists( ) with the watch flag set on the path in the lock directory with the next lowest sequence number.
> if exists( ) returns false, go to step 2. Otherwise, wait for a notification for the pathname from the previous step before going to step 2.