Initial router refactoring.

Define a `Locator` interface for pluggable discovery services. Extract
etcd peer discovery into an `EtcdLocator` struct.

* Add `Router.{SetLocator, Locator, FormatURL}()`.
* Replace `Router.Unregister()` with `Close()`.
* Expose the etcd key prefix as `EtcdConf.Dir` and the minimum refresh
  interval as `EtcdConf.RefreshInterval`.
* Use a buffered channel as a semaphore instead of manually partitioning
  the returned contacts into buckets.
* Account for non-default HTTPS ports when constructing the etcd key.
Update the sample config.