Separated-out AsyncDownloader class as it will be useful for testing run loops in both single- and multi-threaded tests.