Combine channels into single archive, match patterns when consumed

This fixes most of the performance issues discovered with #bc09255.
Instead of storing messages in a key per-channel (which requires slow
unioning and re-sorting during every call to consume), I discovered
that archiving them together and matching the channel pattern message-
by-message was significantly faster. Consumers recovering from failure
can actually catch up to pub/sub now, bringing sustainable performance
back to around 35k/sec.

Along with storing messages in a single archive, it made sense to
split this archive up over multiple buckets over time to allow for
easier expiration and migration. Currently each archive bucket holds
100,000 messages. This might be adjusted in the future as I'm able to
start using remq in production.
Bump version to 0.0.3

Once again I made a major breaking change with the last commit.
Things are improving rapidly, but hopefully the basics will start to
stabilize soon.