Instead of "relaying" messages from the MQTT subscriber to the HTTP
request via a second channel, we now collect each batch of messages and
serialize them into a buffer. This makes it possible to retry the HTTP
request if it fails, without losing any data. Using the `Bytes` data
structure is the most effecient way to do this, as it implements `Clone`
without copying, so each iteration of the retry loop uses the same data
in memory.
Being able to retry failed HTTP requests eliminates the need for the
"preflight" request entirely.
The `metrics` crate, along with `metrics-exporter-prometheus`, makes it
extremely easy to instrument code with metrics and export them to
Prometheus. Here, we're adding a few metrics to track how many messages
are being processed and monitor the queue depth.