All 3 indexing stages now implemented

The 3 indexing stages are:
- Queue Generation: generate a list of all course files in the system
- Add New Files: process the queue, look for untagged files we haven't
  seen yet.
- Update Existing Files: scan our existing index, remove any files that
  have been tagged since we last saw them.

We now have a stage indicator on the configuration page to provide
information on what stage we're on.

The new staging system will allow continuous running of the building
block, without having to worry about unresumable operations. All 3
stages are resumable.

Update existing files stage was implemented in this commit. It uses the
ResumableScan operation like the Queue Generation stage, with the same
resume data (new entries in the hosts table) and mechanics.

Batch operations are now more utilized, hopefully it'll provide a bigger
speedup.