added some multithreading hygiene

- switched to using @synchronized callbacks rather than adding
invocation ops to increment the framesWritten count
export() was over-validating
made exports more conservative w/ the runloop

- don’t start up a progress-monitor timer unless there’s a defined
`last` frame.
removed some unnecessary inheritance

- plus there’s no reason to stop writing frames just because the run
was cancelled…
cleaned up callback assignment