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.
> always perform the operation on the current object before marking it as processed

That's basically how I was thinking about this ordering:
```
      this._zk.close();
      this._zk = null;
      this._changeState(this.cxnStates.CLOSED);
```
where closing the client was the operation on the current object and marking processed is emitting the new state.