Add promises to the widget framework.

Parallel to @jasongrout 's solution (human race condition).
Perhaps this error shouldn't be caught, but logged and rethrown:
```javascript
function(e) {console.error(e), return Promise.reject(e);}
```