allow steps to be controlled by an asynchronous process

This was in a previous pull request, but I mangled the branches and github lost track of it.

It is unclear what use it would have for UI interactions, but this was incredibly useful for reset steps that do asynchronous stuff with blocks, i.e. things of the form

```
if (foo) {
    [bar doSomethingWithFinishBlock:^{
        if (bar.isCorrect) {
            [step succeed];
        } else {
            [step failWithError:*error];
        }
    }
}
KIFTestAsyncWaitCondition(foo, error, "Waiting for async process to finish");
```