Simplify inheritance in FileScanner subclasses

The design of the FileScanner hierarchy has bugged me for a long time.
This commit cleans it up substantially, although there is still more
that could be done.

The re-use wasn't flowing in the right direction here, which showed up
as un-DRY-ness. Specifically, the superclass implemented caching in the
`#paths` method and the subclasses tried to leverage that by calling
`super`, but in some places the logic was duplicated (eg. wildignore
handling, cache updating and other management via explicit hash key
manipulation and calls to `#prepare_paths`).

This refactoring centralizes those concerns in the superclass, where
they belong. We delegate to the subclasses only for the cache-miss edge
case (edge case because it generally happen once only). This brings a
few benefits:

- no more cache logic (explicit key use) in subclasses
- no more cache management via `#prepare_paths` in subclasses
- no more wildignore management in subclasses
- less explicit exception-handling in subclasses
- less nesting in subclasses

The major thing that still smells is a mix of explicit param passing
and implicit communication via instance variables. This can be cleaned
up in a separate commit.
doc: update HISTORY with wildignore fix