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.
This conditional confuses me as I'm not sure whether ok is being assigned "len(suaid) > 0 && len(schid) > 0" or whether its going to run "ok = len(suaid) > 0" && "len(schid) > 0". While I'm fairly certain offhand the = can only be used once on the left side of the ; and therefore it will get everything up to the ; it'd be a little clearer like:
```go
if len(suaid) <= 0 || len(schid) <= 0 {
    return "", False
}
return fmt.Sprintf("%s.%s", suaid, schid), True
```
This also follows the general style guideline of handling errors first in the if condition.