Refactor client packet decoding.

Incoming client packets are now decoded into structs, rather than
`map[string]interface{}`. This allows handlers to defer unmarshaling
opaque fields (e.g., ping data) via `json.RawMessage`.

Go's JSON decoder uses case-insensitive matching for struct field names
even if an explicit `json:` tag is specified. This invalidates two of
the `TestHeloCase()` tests; however, this is an implementation-specific
behavior. As before, clients should assume that field names and values
are case-sensitive.
Merge pull request #83 from mozilla-services/feature/decoding-refactor

Refactor client packet decoding, take 2
`TCPKeepAliveListener` => `RateLimitedListener`.

`RateLimitedListener` returns a `TooBusyError` if too many goroutines
are active at once. `TooBusyError` is a temporary error, so
`http.Server.Serve()` will sleep before accepting new connections.

Remove `Application.MaxConnections()`.
Add HTTP request rate limiting.

* Add a `TokenBucket` implementation for throttling requests based on
  the client's IP address.
* Add a `TokenTable` interface and an in-memory `LRUTable` for mapping
  IP addresses to token buckets.
* Add `LimitHandler()` and `RateLimitedHandler`.
Rename `http` to `throttle`.
Increase rate limits for tests.
Add `RateLimitedHandler.canAccept()`.
Remove `Token{Bucket, Table}, RateLimitedHandler`.
Simplify request rate limiting.

* Add `CanonicalURL` for constructing base URLs with default ports.
* Add `ListenerConfig` for configuring the WebSocket, notification,
  and routing listeners.
* Add `ServerConfig.{Socket, Update}`.
* `RateLimitedListener` => `LimitListener`. `LimitListener` uses a
  semaphore to limit the number of accepted connections.
* Add `LimitConn` for tracking and returning leases for accepted
  connections.
* Remove `Application.{MaxGoroutines, KeepAlivePeriod}()`.
* Use separate listeners for the WebSocket and public HTTP muxes.
* `RouterConfig.Addr` => `RouterConfig.ListenerConfig.Addr`.
* Replace `Serv.Listener()` with `Serv.{Socket, Update}Listener()`.
* Replace `Serv.FullHostname()` with `Serv.{Socket, Update}URL()`.
`FlushReply`: Avoid serializing empty slices.
`EtcdLocator`: Remove unused embedded mutex.