Find binary using the registry on Windows

- As a side effect, normalizeBinary() now returns a promise instead of
  a string
- Change runner to adapt to normalizeBinary() being async
- Add tests and change old tests
- Fallback to reading env var when registry access fails

Closes #125
so `runFirefox` used to return `runDeferred.promise` and now it is returning a promise that resolves with the `runDeferred.promise` this is very different.  Instead I think `runFirefox` should still resolve when `runDeferred.promise` resolves.

So change `master.resolve(runDeferred.promise);` to be `runDeferred.promise.then(master.resolve);`