Rewrote promises.

The old code had a few design issues:
- it lacked the ability to inform callbacks of errors (exception completion)
- it was a rather complex mess of code instantiation to get anywhere useful.
New code:
- is simpler and cleaner
- may even be considered elegant..?
- callbacks now receive a promise or future (as apropriate) to fill in;
  this means the future callbacks can now properly evaluate if an exception
  was raised
- required code instantiation is minimal.