in this change:
* new "concurrent map" API using RwLock<HashMap> optimized for
frequent reads.
* we no longer have a concurrent map of log handlers, we instead
have a log handler containing a concurrent map from origins to
circular buffers
* we have a general concept of a "Limit" now which replaces AlertRule
* A route consists of a filter, plus any number of limits, which
can be per-origin limits or global limits
* The set of routes is disjunctive, while the filters and limits are conjunctive
* Limits can also apply per source location
* Different types of rate limiters are unified under the "Limiter"
abstraction
* The log handler also has a set of overall limiters that can be applied
at the end
* This means we can relatively easily express disjunctions of conjunctions
I think the route structure will also be relatively easy to express in toml