Add promises to the widget framework.

Parallel to @jasongrout 's solution (human race condition).
and almost surely, you want to return this so the user can do something useful with the promise.