Add a threaded downloader class.

This class supports getting progress and cancellation.