Refactor and simplify fetchers [ci skip]

This is a rather large commit, but here was no easy way to split it up
into smaller pieces. This commit refactors fetchers to use the abstract
Fetcher class and adds more documentation and consistency to the
fetcher methods.