### Issue Details

* **Electron Version:**
  * v4.0.0
* **Operating System:**
  * Ubuntu 18.04.3 LTS 
* **Last Known Working Electron version:**
  * Unknown

### Expected Behavior
The Resident set size of the Main process when using desktopCapturer.getSources not growing.


### Actual Behavior
Memory leak in the Main process (rss memory growing) when using the desktopCapturer.getSources method in the Rendering process.

### To Reproduce

> main.js
```javascript
const {
    app,
    BrowserWindow
} = require('electron');
const url = require('url');
const path = require('path');

let win;

const logBytes = x => `${x[0]}=${x[1] / (1000.0 * 1000)}MB`;

const logMemory = () => {
    console.log(
        Object.entries(process.memoryUsage())
        .map(logBytes)
        .join(', ')
    );
};

const createWindow = () => {
    win = new BrowserWindow();
    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
        protocol: 'file:',
        slashes: true
    }));
};

try {
    app.on('ready', createWindow);
} catch (e) {
    console.err(e);
}

logMemory();
setInterval(logMemory, 10000);

```

> index.html 
```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.

    <!-- You can also require other files to run in this process -->
    <script src="./renderer.js"></script>
  </body>
```

> renderer.js
```javascript
const electron = require('electron');
const desktopCapturer = electron.desktopCapturer;

const getSourcesLoop = () => {
    console.log('getSources() call');
    desktopCapturer.getSources({
        types: ['screen', 'window']
    }).then(sources => {
        console.log('getSources() success', sources);
        setTimeout(getSources, 5000);
    });
};
getSourcesLoop();
```


### Screenshots
<!-- If applicable, add screenshots to help explain your problem. -->
![image](https://user-images.githubusercontent.com/10058753/63587467-64534d00-c5a4-11e9-9622-630e62cebbdf.png)




shell/browser/api/atom_api_desktop_capturer.cc
std::back_inserter(captured_sources_));
  }
  if (!capture_window_ && !capture_screen_)
    Emit("finished", captured_sources_, fetch_window_icons_);
}
mate::Handle<DesktopCapturer> DesktopCapturer::Create(v8::Isolate* isolate) {
  return mate::CreateHandle(isolate, new DesktopCapturer(isolate));
}
void DesktopCapturer::BuildPrototype(
    v8::Isolate* isolate,
    v8::Local<v8::FunctionTemplate> prototype) {
  prototype->SetClassName(mate::StringToV8(isolate, "DesktopCapturer"));
  mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
      .SetMethod("startHandling", &DesktopCapturer::StartHandling);
}
}  
}  
namespace {
void Initialize(v8::Local<v8::Object> exports,
                v8::Local<v8::Value> unused,
                v8::Local<v8::Context> context,
                void* priv) {
  v8::Isolate* isolate = context->GetIsolate();
  mate::Dictionary dict(isolate, exports);
  dict.SetMethod("createDesktopCapturer",
                 &electron::api::DesktopCapturer::Create);
}
}  
NODE_LINKED_MODULE_CONTEXT_AWARE(atom_browser_desktop_capturer, Initialize)