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?
Didn't @jrconlin mention some function that makes and returns a shuffled slice?