Refactor detection into strategies

This is an an attempt to simplify `Language.detect`, make it easier to understand, and easier to test. This is not ready to merge (tests don't even pass), but I wanted to put it out there to see what people thought about the approach.

Each step of the detection is extracted to a "strategy". A strategy is just an object with a `#call` method that takes `blob` and `languages` (an array of possible languages).  The strategy can return an array of languages (candidates to be used by the next strategy), or nil, which means it couldn't detect anything.

As soon as a strategy returns 1 or 0 candidates, it returns and the remaining strategies are not tried.

If we like this direction, then there's still work to be done, like tests for each strategy.
Yep, good :eyes:.  These all need tests because our current tests don't hit these paths when calling `Language.detect`. We might want to add some more integration-y tests that do hit these code paths.