Migrate reflow to NSOperation and add some more intelligent cancelling

Moving to NSOperation gives much more flexibility in stopping reflows as they
become obsolete. This lets you do useful things like prevent reflows that
started on one space and finished on another, getting windows for both. It's
also just generally a cleaner interface.