`gofmt` 1.3 no longer recognizes `-tabs`.
Add a `common` package.

* `common.Device` parses, validates, and serializes CSUUIDs.
* `common.Error` is a shared interface for Hermes errors.
* `RandomId()`, `GenerateId()`, and `{Un}MarshalId()` are UUIDv4
  helper functions extracted from the `cn` package.
Refactor `cn.Conn`.

* Restrict `clientConn` visibility to the `cn` package.
* `Conn.DeviceId()` => `Conn.Device`
* `Conn.{Receive, Send}()` => `Conn.{ReadMessage, WriteMessage}()`.
* `Conn.write()` => `Conn.Send()`. Add `Conn.Receive()`.
* Remove the type assertion from `cn.NewNode()`. The connection state machine
  is now managed by `Conn.Receive()`. Update the `Conn` interface to reflect
  this.
* Change the `NewConn()` return signature to `(Conn, error)`.
* Add `Conn.Id()` for retrieving the unique connection ID as a string. Each
  `Conn` is now identified by a UUIDv4, separate from the device ID.
* Remove the `readyCloser` interface and related methods.
* Replace all uses of `cn.Device` with `common.Device`.
  `RouterTo.DeviceId()`=> `RouterTo.Device()`.
* Allow `Router.Close()` and `Conn.Close()` to be called multiple times
  without blocking or panicking.
* Remove `clientConn.errChan`.
* Enforce connection timeouts and ping intervals.
* Ping intervals are expressed in seconds, not milliseconds.
* Add `conn.closeWithError()` for cleaning up connection state after it has
  been added to the router. Client connections that could not be added to the
  router following authentication are closed.
* Remove `cn.Key`. Move key verification logic to `common.Device`,
  `Router.GenerateCredentials()`, and `Router.VerifyCredentials()`.
`Error.Service()` => `Error.Server()`.

Avoids confusion with IR/OR Service API-related errors. Rename
`cn.KeyError` to `cn.ClientError`.
`cn.ServerConfig`: Add a `maxConns` setting.

Overflow clients will have their connections closed.
Refactor `cn.Router`.

* `MessageRouter` => `nodeRouter`.
* `Router.Close()` may now be called multiple times without blocking or
  panicking.
* `Router.route()` => `Router.Route()`.
* Change the return signature of `Router.VerifyCredentials()` to
  `(common.Device, bool)`. Both malformed and invalid keys result in an
  authentication failure, so there is no need to forward errors to the
  caller.
* `Router.{Add, Remove}Conn()` now return errors.
* Remove the `readyCloser` interface.
* Remove `router.logClients()`; log the client count within the `Route()` loop.
* Duplicate clients are now evicted correctly.
* UUID collisions will force the client to reconnect.
Remove unused IR/OR protocol implementations.