suspend fun execute(spec: Spec): Try<Map<TestCase, TestResult>>
The intention of this runner is that each TestCase executes in it's own instance of the containing Spec class. Therefore, when we begin executing a test case from the queue, we must first instantiate a new spec, and begin execution on that instance.
As test lambdas are executed, nested test cases will be registered, these should be ignored if they are not an ancestor of the target. If they are then we can step into them, and continue recursively until we find the target.
Once the target is found it can be executed as normal, and any test lambdas it contains can be registered back with the stack for execution later.