Default brute-force query algorithm
Has some basic optimisation: it hoists regular expressions out of the
query to use with grep, so we can narrow down the set of topics that we
have to evaluate the query on.
Not sure exactly where the breakpoint is between the
costs of hoisting and the advantages of hoisting. Benchmarks suggest
that it's around 6 topics, though this may vary depending on disk
speed and memory size. It also depends on the complexity of the query.
TODO: There is an additional opprotunity for optimisation; if we assume
the grep is solid, we can cut those parts of the query out for the full
evaluation path. Not done yet, because CDot strongly suspects it won't make
much difference.