I mentioned the other day about "a bit of a hack" that I couldn't find a
way to avoid. After sleeping on it, I did find a much cleaner way.

The problem involved classifying threads in a worker pool, so eg only a
certian number of transfer threads and a certian number of checksum threads
run at the same time.

I had been relying on the stages used internally by git-annex commands to
classify the threads. And that is a reasonable default for random git-annex
commands that might do anything, but for a specific command like `git annex
get` that is all about transferring and checksumming, it would be better to
mark the segments of code that do transfers and checksums, and have a way to
specify which what classifications matter for scheduling the actions of the
command.

As well as cleaning up the design, that also fixed one bug in the thread
classification. And, it would now be easy to classify threads in other
ways specific to particular commands.

---

Then I spent too long fixing a STM deadlock. Same one I spent too long
"fixing" the other day, but I really understaood it and fixed it this time.
