I have an alternate version of attempt-run-step and future-for-step in this gist:
https://gist.github.com/myronahn/c7ed0469bb3411c88273

I think it is a bit more bulletproof in that it makes sure the promise gets delivered in the finally clauses.  The parens need cleaning up, though.

The reason I wrote it this way is that I noticed that async would sometimes stall without returning.  I never tracked it down, but I decided to be a bit more paranoid.