Async queue runner fixes

If an async spec throws an exception during the synchronous part of the execution (where the try/catch still takes effect), the QueueRunner now finishes off the rest of the functions that it was supposed to run (iteratively since recursive isn't necessary). 

Also gets QueueRunner back to where it properly waits for an async spec, instead of just finishing the suite.