### Preflight Checklist
<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->

* [x] I have read the [Contributing Guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md) for this project.
* [x] I agree to follow the [Code of Conduct](https://github.com/electron/electron/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
* [x] I have searched the issue tracker for an issue that matches the one I want to file, without success.

### Issue Details

* **Electron Version:**
8.0.0
* **Operating System:**
Only tested on mac 10.14.16 (Mojave)
* **Last Known Working Electron version:**
5.0.0   (not a regression range, this is the version I was using before)


### Expected Behavior
electron.screen can be used

### Actual Behavior
electron.screen can't be used if it was attempted to use before app ready event.

### To Reproduce
Details: it looks like that electron.screen is a lazy getter that gets badly cached if its initialization throws.
I had an `electron.screen` usage that threw the following error:

> "The 'screen' module can't be used before the app 'ready' event"

That's all fine and expected. However, a later usage of any of the APIs from `electron.screen`, for example `electron.screen.getAllDisplays()`, throws the following exception:

> callback can only be called for once

which, given the weird phrasing unrelated to the issue at hand, I believe is not intentional
shell/browser/api/electron_api_screen.cc
v8::Local<v8::FunctionTemplate> prototype) {
  prototype->SetClassName(gin::StringToV8(isolate, "Screen"));
  gin_helper::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
      .SetMethod("getCursorScreenPoint", &Screen::GetCursorScreenPoint)
      .SetMethod("getPrimaryDisplay", &Screen::GetPrimaryDisplay)
      .SetMethod("getAllDisplays", &Screen::GetAllDisplays)
      .SetMethod("getDisplayNearestPoint", &Screen::GetDisplayNearestPoint)
#if defined(OS_WIN)
      .SetMethod("screenToDipPoint", &display::win::ScreenWin::ScreenToDIPPoint)
      .SetMethod("dipToScreenPoint", &display::win::ScreenWin::DIPToScreenPoint)
      .SetMethod("screenToDipRect", &ScreenToDIPRect)
      .SetMethod("dipToScreenRect", &DIPToScreenRect)
#endif
      .SetMethod("getDisplayMatching", &Screen::GetDisplayMatching);
}
}  
}  
namespace {
using electron::api::Screen;
void Initialize(v8::Local<v8::Object> exports,