Refactor public api to use ES6 Promises

* All public apis now use promises.
* Greatly simplifies asynchronous control flow and error handling. Error handling is now done globally, the stack trace is logged, and a high level error is thrown that is understandable to users.
* If native WebCrypto ist supported two promises are started in parallel to speed up the key generation of the primary key and subkey.
* If promises are not supported by a target browser, a [polyfill](https://github.com/jakearchibald/es6-promise) must be added to the application.
* Update README and documentation to inform about promises and the polyfill.