`{Router, *Locator}.Close()` should be idempotent.
`EtcdLocator`: Periodically refresh contact lists.

* `refresh()` => `registerLoop()`.
* `fetchLoop()` now automatically updates the contact list if a
  contacts request is not received within the refresh interval.
* `Init()`: Remove bare returns; clean up conditionals.
Locator: `MaxParallel()` => `BucketSize()`.

Revert to the previous behavior of partitioning contacts into buckets
and broadcasting updates to each bucket, instead of using a lease
channel.
Move the `BucketSize` option to `RouterConf`.

Remove `Locator.BucketSize()`.