Rewrite to use the pure JS zookeeper client library

- [ ] The purejs `node-zookeeper-client` does throw when some unexpected things happen so some `try`s are probably needed in here.
- [ ] Fix tests / travis / the vm
Okay, looking at the `_changeState()` code I think this is fine.

```javascript
this._cxnState = to;
if (this._stateEmitter) {
  this._stateEmitter.emit(to, data);
```

The new state is assigned synchronously, then the event emitter fires, so this code doesn't defer to the event loop before the state change is complete, meaning any other operation which begins will have the correct information about the state. 

Acquiring a lock is a multi-step process, though, so I think there are race conditions similar to what you suggest (say, closing mid-lock) which I need to think about, but I'm not sure why (except that `close` calls are very rare and usually happen at process shutdown) we wouldn't have seen it with the prior code also.