public void Launch(Action <Exception> done)
        {
            if (_task != null && !_task.IsCompleted)
            {
                throw new InvalidOperationException($"Can't launch {Id} while previous instance is {_task.Status}");
            }

            var procID = _machine.NextProcID();
            var env    = new SimProc(Id, _machine, procID, _factory);

            _task = _factory.StartNew(async() => {
                try {
                    var engine = _launcher(env);
                    try {
                        await engine.Run();
                    } finally {
                        await engine.Dispose();
                    }
                } catch (AggregateException ex) {
                    done(ex.InnerException);
                    return;
                }
                catch (Exception ex) {
                    done(ex);
                    return;
                }

                done(null);
            }).Unwrap();
            _proc = env;
        }