`Reply.Id()` => `Id() (string, error)`.

This change allows anonymous packets (`ClientPing`, `ClientPurge`, and
`ClientACK`) to return errors instead of a sentinel `"*"` ID.

Add an internal `requestWithErrors` interface for testing.
`Conn.fatal()`: Avoid overwriting `lastErr`.
`Decoder` interface changes.

* Change the `Decode` signature to `(*Conn, Fields, int, string)`.
* `Conn.readMessage()` now calls the decoder function before returning
  a `ServerError` for typed error responses. This allows decoders to
  return custom errors.
* Extract `"update"` packet decoding logic into `Conn.decodeUpdate()`.
* Remove `decodePing`.
Add `{Valid, Decode}Id()`.
Refactor `TestClient`.

* Remove `clientState` and the connection state machine.
* Add `TestClient.{subscribe, notifyAll}()`.
* Add `PushThrough()` for receiving and acknowledging multiple
  notifications on an existing client connection.