Merge branch 'dev' (refactor message queues, etc.)
Message queue: revert messages keyname change to maintain backward-comp with old mq design
v2.4.0-beta1
README: List message queue guarantees
README: rename `mq`->`car-mq`
Carmine proper: fix broken test key fn
Message queue: add TODO for possible integration with 2.8+ Pub/Sub notification
Message queue: expose `finalize` fn for atomic-unlocking handlers, fix `error` fn
Message queue: add support for multi-threaded workers
Message queue: default monitor now backs-off warning for 6hrs (from 1hr)
Message queue: expand worker `try` block to cover loop control for extra safety
Revert "Message queue: expose `finalize` fn for atomic-unlocking handlers, fix `error` fn"

This reverts commit 7bae2bad3c826fd00bc04848fdc68693c48cb3ce.
Message queue: add message id to handler args
Message queue: add `enqueue` option for treating locked messages as non-dupes

This gives us another mechanism for eliminating race conditions: much simpler
for API consumers (though slightly less flexible) than using `finalize` with
an atomic handler.
Tundra: add TODO
Tundra: completely refactor to use standard mq worker

Pros:
* Significantly simpler.
* More robust (uses trusted, tested mq for heavy lifting).
* Inherits mq features like retry & backoff.
* Allows better datastore work distribution (freezing isn't done in batches).
* Easier datastore protocol extension (works on single keys rather than maps).

Cons:
* Old batching method -may- be preferable against certain stores.
Tundra: refactor Faraday DataStore for new API
Tundra: add S3 DataStore, skeleton disk & Carmine DataStores
README: Clean up Tundra docs, mention new S3 impl, alpha->beta
Tundra: new unit tests