as with TLS, the destruction of a client stream on failed read needs to be conditional: if we reached failed_read_cb() as a result of a timeout on a timer which has subsequently been reset, the stream must not be closed.