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?
This needs to be copied, otherwise they both refer to the same underlying structure.