Separate task graph from work execution.
Squashed commit messages : Draft. Draft 2. Draft 3. Deadlock. Lock worker lock and compute engine lock in the same order everywhere. Forward SpRuntime nbThreads argument to SpComputeEngine constructor. Remove debug printouts. Lock all locks in scoped ordered lock through a unique_lock instance. Implement svg trace function in SpTaskGraph. Implement stopAllThreads function in SpRuntime. Use plain mutexes in SpScopedOrderedLock. Allow compute engine pointer of worker to be changed by main thread. Remove unnecessary boolean variable. Optimize for the case where workers just keep popping the next task from the same compute engine. Begin work on detachWorkers function. Begin remodeling code to allow workers to be detached. Deadlock. Working version. Remove unnecessary shouldBeMigrated member variable. Properly stop workers and compute engine. Fix broken svg trace generation function. Remove unused classes. Add compute engine and task graph unit tests....