- Electron version: 1.3.6
- Operating system: Windows 7 x64
- Other: Microsoft Office 2013 (will make more sense in a bit)

`shell.openItem()` is a blocking call, it would be nice if it's async or has an async version to handle synchronous external application behavior.

Reproduce: 
Open a password-protected Microsoft Excel file, `shell.openItem()` will be blocking until the Password window is submitted or dismissed. Consequently Microsoft Word does not have this issue.

Related to #2761.

shell/common/api/atom_api_shell.cc
gin_helper::Promise<void> promise(args->isolate());
  v8::Local<v8::Promise> handle = promise.GetHandle();
  platform_util::OpenExternalOptions options;
  if (args->Length() >= 2) {
    gin::Dictionary obj(nullptr);
    if (args->GetNext(&obj)) {
      obj.Get("activate", &options.activate);
      obj.Get("workingDirectory", &options.working_dir);
    }
  }
  platform_util::OpenExternal(
      url, options,
      base::BindOnce(&OnOpenExternalFinished, std::move(promise)));
  return handle;
}
bool MoveItemToTrash(gin::Arguments* args) {
  base::FilePath full_path;
  args->GetNext(&full_path);
  bool delete_on_fail = false;
  args->GetNext(&delete_on_fail);
  return platform_util::MoveItemToTrash(full_path, delete_on_fail);
}
#if defined(OS_WIN)
bool WriteShortcutLink(const base::FilePath& shortcut_path,