Support Test which return Task

Currently methods marked with the `[Test]` attribute can only return void. This change allows tests returning `Task` to be used, treating them as async tests and verifying their completion.

Basically, if a `[Test]` method returns `Task`, we'll create a wrapping function that will run the method, await the returned task's completion, and verify that the task did not fault, then resume QUnit operation.

The change results in a lot of redundant emitted code, but I couldn't really find a better place to put some of the repeated parts (since there's no distributed .js file associated with this project).

I also did a little refactoring around the area since I found the massive `Tuple<>` a little difficult to read.

(This pull request is in reference to #1 )