async run () {
    if (!this.commands) { throw new Error('Create a new commandRunner with your new commands.') }

    for (const command of this.commands) {
      const runPromise = command[run]()
      if (this.cancelled) {
        // Required to give time for the command to initialize enough to cancel.
        await new Promise((resolve, reject) => setTimeout(resolve, 25))
        command[cancel]()
        continue
      }

      this.runningCommand = command

      const cancelSignalPromise = new Promise((resolve, reject) => {
        this.cancelSignal = resolve
      })

      /**
       * This race exists as a cancelled promise never resolves.
       * Thus we need a cancel signal that we can use to prevent a deadlock.
       */
      await Promise.race([runPromise, cancelSignalPromise])
      this.runningCommand = null
    }

    this.commands = null
  }
Runs the commands that are internally stored.
The commands must be extended from the `AbstractCommand` class.

Commands are run with imported unique symbols, allowing protected methods to be run.

A command is run with:

```js
command[run]()
```

and cancelled with:

```js
command[cancel]()
```