Use Promises

Here's an extension to the first pull request. I love promises -- they make everything a lot easier to work with, and have a very simple interface even compared to callbacks. They are also becoming much more common in javascript. Adding promises allowed me to remove a huge amount of code from this library, adds a bunch of flexibility for users, doesn't slow anything down at all, and all tests are still passing.

If you do end up accepting the coffee PR, I can rebase it on top of that one :grinning: