Restructure control flow to be asynchronous

When we add remote data and template sources, these calls will be
asynchronous, so the stack leading down to those calls needs to also be
aware that calls will not necessarily be done after calling render().
Move logging into the rendering callback

There is more information available here, beyond the need for this to
only be displayed once the write has succeeded.