Implement pluggable storage adapters

This pull request refactors the existing memcached storage implementation, and adds a generic `Storage` interface for custom backing stores. A `NoStore` adapter is also included for Loop.

* The previous memcached routines have been extracted into an `EmceeStore` driver that supports dynamically-sized memcached pools.
* `{Gen, Resolve}PK` have been moved to `Store.{IDsToKey, KeyToIDs}`, respectively. This allows storage adapters to define their own key marshaling and unmarshaling routines.
* `storage.getElastiCacheEndpointsTimeout()` uses a buffered channel to avoid phantom Goroutines if the request times out.
* `{Handler, Application, PropPing, Serv}.storage` => `*.store`.
* `storage` is now loaded as an extensible section. The configuration loader will panic if the loaded logger and storage plug-ins do not satisfy their respective interfaces.
* Storage adapters are now closed on exit.

Closes #31. Awaiting r+ from @jrconlin, @bbangert.
Really? The original adapter looked like it used [`ENCODING_GOB`](https://github.com/mozilla-services/pushgo/blob/70d430368215d8573e5d4de6cbdf33ca5a33edf3/src/mozilla.org/simplepush/storage.go#L365), which I replicated in [`newClient()`](https://github.com/mozilla-services/pushgo/blob/pluggable-storage/src/mozilla.org/simplepush/emcee_store.go#L965). Another alternative might be to have the channel record implement `gob.GobEncoder` and `GobDecoder`, though.