step_func propagates result, add unreached_func, 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, as well as
test.unreached_func which is handy for assigning to callbacks or
Promise catch clauses.