Add promises to the widget framework.

Parallel to @jasongrout 's solution (human race condition).
I haven't thought through the implications of chaining promises continually like this; it's not going to lead to an increasing slowdown as one widget gets updated again and again, is it?