Initial storage adapter refactoring.

Extract the memcached-specific routines into an `EmceeStore` struct
that supports dynamically-sized memcached pools. Define an `Adapter`
interface for pluggable storage adapters. Define a `Store` struct that
implements the old `Storage` interface.

Implement a `NoStore` adapter for Loop.

* Replace the `mcstorage` qualified import with the `storage` package.
* Move `{Gen, Resolve}PK` to instance methods. This allows storage
  adapters to define key marshaling and unmarshaling routines.
* `storage.getElastiCacheEndpointsTimeout()` should use a buffered
  channel to avoid phantom Goroutines.
* `EmceeStore.storeAppIDArray()` propagates errors if the write fails
  or the `uaid` parameter is empty.
* Remove `EmceeStore.isFatal()`.
* Clean up primary key serialization in `{fetch, store}Rec()`.
* The live, registered, and unregistered channel timeouts are now
  expressed as `time.Duration` values.
* Move `indexOf()` to `ia.IndexOf()`.
Integrate configuration changes. See #37.

* `Adapter` => `Store`.
* Remove all uses of the `Storage` struct with the `Storage` interface.
* Update all `Storage` methods to accept strings instead of byte slices.
* `{Handler, Application, PropPing, Serv}.storage` => `*.store`.
* `PushWS.Storage` => `PushWS.Store`.
* `Application.Storage()` => `.Store()`.
* Load `storage` as an extensible section. Panic if the loaded logger
  and storage plug-ins do not satisfy their respective interfaces.
* Refactor `Serv.Update()`.
* Refactor `Worker.Ack()`.
Add missing license headers.
`NoStore`: Expose `MaxChannels`.
Clean up Emcee adapter configuration.

* Reintroduce ElastiCache support.
* Change `{Recv, Send, Poll, Retry, Handle}Timeout` configuration
  fields to strings. Reintroduce `parseDuration()` as `parseTimeout()`
  for converting timeout field values to `time.Duration`s.
Register Emcee as `"memcache"`.
Close the storage adapter on exit.
Update the sample config.
Fix package import ordering.

Move `{Encode, Decode}ID()` into `uuid.go`.
Syncing up with `dev`.
Add `Application.Stop()`.
Replace `Worker.filter` with `ValidUAID()`.
`StorageError.Error()`: Avoid infinite recursion.
Clean up `{KeyToIDs, IDsToKey}()`.

Change the `NewEmcee` signature to `NewEmcee() *EmceeStore`.
Remove unused `{Fetch, Put, Drop}Host()`.

Remove the `HostPrefix` option.
`EmceeStore`: Use `logger.Error()` for app errors.
Move `GetElastiCacheEndpoints{Timeout}` to `aws`.
`EmceeStore`: Remove `parseTimeout()`.
`EmceeStore`: `ia` => `ChannelIDs`.

`fetchAppIDArray` now releases the memcached client before removing duplicate
channel IDs.
Simplify type assertions and `recover()` calls.