refactor(client): denodeify jwcrypto calls to reduce boilerplate.

@zaach - I was trying to figure out how to create signed JWTs and found a feature in P that could help use reduce boilerplate code with node-style callbacks. the P.denodeify function converts node-style callbacks to promise returning functions.
chore(metrics): Namespace errors for metrics logging and other error logging updates.

@kparlante asked for us to add a bit of context, like a screen name, to errors so that it is easier to decide where an error originated. This led down a bit of a rabbit hole of cleaning up the error code.

* The different error types overlap in their errno's, this adds a namespace so that different errors are able to be selected from the metrics logs.

Namespaces used:
* auth-errors.js: 'auth'
* oauth-errors.js: 'oauth'
* profile-client.js: 'profile'

* The `message` field of auth-errors.js.toError was never used, so this is repuprosed to pass in a `context`.
* The format of an error event has changed to accommodate a context: 'error.<context>.<namespace>.<errno>
* When a view's `logError` function is called, the screen name is set as the error's context.
* base.js called metrics.js to fetch ids for screens and errors, then called metrics.js->logEvent. Updated to just call `logError` and `logScreen`
* A couple of TestHelper functions were added: `isScreenLogged` and `isErrorLogged`

fixes #1500
Merge pull request #1653 from mozilla/denodify-in-crypto

refactor(client): denodeify jwcrypto calls to reduce boilerplate.
fix(oauth): increase the assertion lifetime to avoid clock skew issues
Merge pull request #1630 from mozilla/issue-1500-namespace-errors

chore(metrics): Namespace errors for metrics logging and other error logging updates.
Merge pull request #1655 from mozilla/issue-1649-assertion-expiration

fix(oauth): increase the assertion lifetime to avoid clock skew issues

Since the leaf portion of the assertion has the exp time set by the client,
a client with a very "off" clock can produce assertions that are already expired.
Making the exp time "a long time in the future" effectively makes the lifetime
of the assertion  determined by the lifetime of the signed public key
(currently 6hrs), which is an acceptable tradeoff.

r=ckarlof
Fixes #1649
feat(metrics): Log `entrypoint` to the metrics.

* Add the FxDesktopRelier that imports `entrypoint` and `context` from the URL.
* Relier extended to import `service`, `redirectTo`, `client_id`, and `state`
* Initialize either the FxDesktopRelier or normal Relier on startup.
* Instead of Metrics importing values directly from the URL, they are fetched from the Relier and passed in on creation.

fixes #1568