Make InvokeOnce thread-safe
Refactor the multi-threaded worker logic out of the main logic and into its own class and cleanup a bit (should have been two commits)
We need to buffer all output unfortunately, because unlike in the serial execution scenario we can end up in a sitution where whilst we are writing to the console another thread is also and the output gets interwinded. (For example happens with Fluent Migrator)