Curator implements a bunch of algorithms often implemented on top of ZooKeeper. I like to think of ZooKeeper as the distributed systems equivalent of peer-reviewed implementations of cryptographic primitives. Curator is a like a whole cryptographic protocol / cryptosystem. In both cases: don't implement your own!
That is a fantastic analogy (and a great library), in my experience it's works well but takes effort in ongoing maintenance (log cleaning, etc). Also, it acts as a canary in the coal mine for other networking problems.
I've also used it in a WAN setup for low throughput, transactional data that I needed solid exactly-once semantics. Some of the docs related to WAN settings were non-existent but eventually it worked as intended, thanks to the help of the community.
There are some interesting new alternatives such as etcd / serf/consul - but at the time ZooKeeper had the best track record (under Jepsen analysis). Things might have changed since then.
I've used ZooKeeper not only as a service registry but also as a fairly small message queue - I wanted to be sure that my message will be delivered at least once, and thanks to Kazoo's (Python ZK library) LockingQueue recipe I was able to get what I want really easily with all the benefits from ZK's clustering nature.
I can't speak for zookeeper, but I've been using consul in production since 1.0. I've never had an issue with it - it works great for me! I've written a ruby gem to interface with it's API called Diplomat (here: https://github.com/WeAreFarmGeek/diplomat) and a whole bunch of ansible scripts to setup checks for postgres, nginx, etc.
Curator implements a bunch of algorithms often implemented on top of ZooKeeper. I like to think of ZooKeeper as the distributed systems equivalent of peer-reviewed implementations of cryptographic primitives. Curator is a like a whole cryptographic protocol / cryptosystem. In both cases: don't implement your own!