Use promises in the JS contents API

Switch from passing success/error callbacks to returning ES6 promises.

Opening early so we can see if Travis likes simple promise use cases.
Tags are loaded synchronously, are they not? http://www.krux.com/company_blog/synchronous_vs_asynchronous_tags_whats_the_big_deal/