Asynchronous task support for entry and render()

Moves the logging logic into the render() method, and then wraps up the
existing entry point code and the render() method to support an ES6
Promise-based control flow.