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
Clarify log levels. Closes #39.

* Critical: Logs fatal errors that prevented the server from starting
  (e.g., missing or invalid configs), or caused the server to stop
  prematurely.
* Error: Logs errors that were fatal for a particular request, and may
  affect other requests (e.g., memcached connection errors, discovery
  service unavailable, bad data returned from database).
* Warning: Logs errors affecting individual requests (e.g., bad data
  sent by the client or app server). The push server can respond
  normally to other requests.
* Info: Normal service operation.
* Debug: Verbose debugging output.

Logger calls that may incur overhead (such as function calls) are now
wrapped in `Logger.ShouldLog()` checks. This check is omitted if the log
fields contain simple string values, since `Logger.Log()` calls
`Logger.ShouldLog()` internally.