Monads suit the problem nicely and it's been done in quite a few languages already:
http://lambda-the-ultimate.org/node/4117
http://ocaml.janestreet.com/?q=node/100
http://en.wikibooks.org/wiki/F_Sharp_Programming/Async_Workf...
This is something that JavaScript desperately needs.
Macros aren't so nice for this stuff in non-homoiconic languages.