step_func propagates result, Promise examples

In async tests, using testharness.js effectively requires that callbacks are wrapped with `step_func()` calls so that assertion failures are caught by the test harness. Promise chaining requires that the callbacks return values, so `step_func()` needs to return the value returned by the wrap function, in normal cases.

This adds some examples of Promise functionality (assuming ES6 promise support in your browser) and the `step_func` fix.