Hmm, just realized one more thing that I should have noticed before...we should call `finish()` in the case where it times out (so the anim class gets cleaned up and the original event handler is removed). That doesn't matter in the case where the element is going to be removed anyway, but it matters if the element is going to stick around.

So maybe the right way to do this is to have the `webkitTransitionEnd` handler resolve the promise, and put the call to `finish()` in a `done()` handler for the returned promise (so it gets called regardless of whether there's a timeout). The check for `e.target === target` would have to move into the `webkitTransitionEnd` handler. So, something like this:

```javascript
function finish() {
    $target
        .removeClass(animClass)
        .off("webkitTransitionEnd", finish);
}

...
$target
    .addClass(animClass)
    .on("webkitTransitionEnd", function (e) {
        if (e.target === target) {
            result.resolve();
        }
    }

return Async.withTimeout(result.promise(), timeoutDuration, true)
    .done(finish);
```

Does that make sense? Sorry, should have caught that before...