Add promises to the widget framework.

Parallel to @jasongrout 's solution (human race condition).
Do we still need state_lock in addition to the ordering imposed by the chained state_change promises?