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.
imo these things should throw, not even fail, because they're API contract breaches.
there's plenty of cases I can see where you might be algorithmically building a lock path where you wouldn't expect the path to end up with '/' but it does because one of the parameters of your build function is null.

Think something as simple as
```javascript
lock_path = [nodeId, resourceId, hostId].join('/');
zkultra.lock(lock_path, function(err, res) {
...
});
```
If for any reason hostId is null you get a trailing slash, and in this case, you want this error to crash your service instead of silently wrecking havoc because the right lock hasn't been acquired.