Adds a new Filesystem class to abstract away `os` module

This makes classes more easily testable via mocks, and I should really be avoiding pure `os` calls anyway.

Adds unit tests to the filesystem class to ensure it works
Refactors Console to use the new Filesystem class
Creates a new class to handle ROM Finding logic.

Also adds unit tests for said class.
Adds CombinedProvider to aggregate results from multiple different grid providers

The logic to determine the hierarchy of grid provider results was stuck in ROMManager, which was kind of a catch-all class for syncing functionality before. I would like to move this functionality into its own object for testability, hence CombinedProvider. CombinedProvider implements the GridImageProvider interface itself, but merely provides a wrapper of that interface over multiple different objects. It is order-dependent, so `CombinedProvider(provider1, provider2)` will give different results from `CombinedProvider(provider2, provider1)`. This has the benefit though of making consumers completely unaware of whether they are interacting with a group of providers or with a single one.
Moves the grid image updating logic to a new class, SteamGridUpdater

ROMManager had two main duties, sync ROMs and update grid artwork. This commit moves the second piece of functionality to a new class, and a later commit will extract the first bit. This localizes functionality in a much better way and keeps relevant dependencies together.