Simplify `EtcdLocator.Contacts()`

* Replace channels with a `sync.RWMutex`.
* Use a ticker to refresh the contact list.
* Use `rand.Perm()` instead of re-shuffling the list for every `Contacts()` invocation.

@jrconlin, @bbangert r?
math.Perm(), but I'm not sure it's really useful here, unless we store the servers as a list, and then keep a separate Perm() shuffled list for indexes. We can pay for speed with memory if that's optimal.