### 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
return screen_->GetPrimaryDisplay();
}
std::vector<display::Display> Screen::GetAllDisplays() {
  return screen_->GetAllDisplays();
}
display::Display Screen::GetDisplayNearestPoint(const gfx::Point& point) {
  return screen_->GetDisplayNearestPoint(point);
}
display::Display Screen::GetDisplayMatching(const gfx::Rect& match_rect) {
  return screen_->GetDisplayMatching(match_rect);
}
#if defined(OS_WIN)
static gfx::Rect ScreenToDIPRect(electron::NativeWindow* window,
                                 const gfx::Rect& rect) {
  HWND hwnd = window ? window->GetAcceleratedWidget() : nullptr;
  return display::win::ScreenWin::ScreenToDIPRect(hwnd, rect);
}
static gfx::Rect DIPToScreenRect(electron::NativeWindow* window,
                                 const gfx::Rect& rect) {
  HWND hwnd = window ? window->GetAcceleratedWidget() : nullptr;
  return display::win::ScreenWin::DIPToScreenRect(hwnd, rect);
}
#endif
void Screen::OnDisplayAdded(const display::Display& new_display) {
  base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
      FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this), "display-added",
                            new_display));
}
void Screen::OnDisplayRemoved(const display::Display& old_display) {