`Worker.Hello()`: Fix a `forceReset` regression.

As of #65, `{Emcee, No}Store.Exists()` correctly returns `false` if a
device ID has not previously registered with the push server. This
change caused `Worker.Hello()` to reset all client-specified IDs.

The client will now be assigned a new ID under the following
conditions:

* An explicit ID is not specified (i.e., the `"uaid"` field is `""` or
  omitted entirely).
* A client with the specified ID is already connected.
* The number of channels in the opening handshake exceeds the number of
  subscriptions allowed by the backing store.
* The client specifies existing channels for a nonexistent ID.
Expand `TestHeloInvalidIds()`.
Use named struct fields. Add `make vet`.
`RouteHandler()`: Decode payloads into `Routable`.

Remove `Routable.DeviceID`; the device ID is specified in the URL.
Merge pull request #79 from mozilla-services/feature/nits

Miscellaneous nits
Merge pull request #80 from mozilla-services/bug/force-reset

Fix a `forceReset` regression
Merge pull request #81 from mozilla-services/feature/pinger

Refactor proprietary pingers
Merging #81.
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.