Avoid decoding `nil` config structs.
Add `IsKeyExist()` and `EtcdPinger`.
Add a `Balancer` interface.
Add `Updater` and `PeriodicUpdater`.

A periodic updater publishes and fetches data on an interval, caches
fetches, and retries failed operations with exponential backoff.
Refactor `EtcdLocator` to use `PeriodicUpdater`.
`TestServer.load()`: Add `PluginBalancer`.
`CanonicalURL` => `CanonicalHostPort`.

Add `Serv.{Client, Endpoint}Host()`.
Add `Router.{Host, URL}()`.

`EtcdLocator` now uses `Router.Host()` to create the etcd key.
Add `EtcdBalancer`.

* `PluginLoaders.Load()` should initialize the balancer after the
  server.
* `Application.Stop()` should close the balancer.
Support redirects in `Worker.Hello()`.

Add balancer health to the service status report.