Export progress via runnable

It spends 80% of its time in getRestricted which doesn't report
progress, but it starts moving before that, so users shouldn't
be too surprised.

Since runnables can't be run with parameters given at runtime, I
guessed percentages for the different stages of the operation and
made sure progress.run() would be run ~100 times.