Async template updates

Allow either/all of:

 * contents (template)
 * args (template parameters)
 * result from a template

to be promises.

----

So I've tested this locally and it looks fine, but before we merge we should add tests for:

- [ ] `.html(String)`
- [ ] `.html(Promise{String})`
- [ ] `.html(Function, Object)`
- [ ] `.html(Function, Promise{Object})`
- [ ] `.html(Promise{Function}, Object)`
- [ ] `.html(Promise{Function}, Promise{Object})`
- [ ] `.html(Function{return: Promise{String}}, Object)`