Implement pluggable discovery adapters and standalone tests

This pull request adds a `Locator` interface for server discovery, extracts the etcd discovery implementation into an `EtcdLocator`, and adds a `StaticLocator` adapter. The config loading mechanism has also been refactored, making it possible to run the tests without etcd, memcached, or a standalone Simple Push server.

* The router now uses a buffered channel (`bucket_size`) instead of partitioning contacts into buckets.
* The etcd key prefix and minimum refresh interval are exposed as `EtcdLocatorConf.Dir` and `.RefreshInterval`, respectively.
* `EtcdLocator` now uses the normalized key (prefix + hostname) consistently, and accounts for non-default HTTPS ports when constructing the key.
* The `PluginLoaders` map associates plugin types (i.e., logger, proprietary pinger, metrics, storage adapter, router, locator, server, and handlers) with initialization functions. This is used by `TestServer` to specify configuration options programmatically. The `*Conf` structures have also been flattened where appropriate.
* The `Host` and `Port` options have been consolidated into `Addr`. If `Addr` is omitted, the server and router will listen on random ports.
* `Server` and `Router` now initialize their own `net.Listener`s, avoiding a race condition where the tests would begin running before the server was ready.

Closes #30. @bbangert, @jrconlin, @rafrombrc r?
I *think* so—this function checks `l.lastRefresh` and returns `l.serverList` if it's been refreshed recently; otherwise, it fetches the list, then updates `l.serverList` and `l.lastRefresh`. Could the lock be held and released around the `l.lastRefresh` check, and then again when updating `l.serverList` and `l.lastRefresh`? In that case, would we ever accidentally store a stale version of the list if two goroutines contend for that lock?

In any case, I moved this into a separate Goroutine (`fetchLoop()`) that updates the list automatically if there's no contact request within the refresh interval.