Introduce use of std.experimental.logger (can be disabled at compile time according to docs) instead of custom "static if try writeln catch" pattern.
Replace the custom thread pool with thin wrappers around the generic std.parallelism.TaskPool. This also does not seem to exhibit the behaviour of crashes when destroyAsyncThreads is not called, so it should not be a hard requirement anymore. It should only need to be called when one has to be certain all tasks in it are completed before program termination.
destroyAsyncThreads
is not called, so it should not be a hard requirement anymore. It should only need to be called when one has to be certain all tasks in it are completed before program termination.