Create a task runner per ChromeOS native filesystem operation.

FileSystemContext defaults to using a single global task runner for
blocking I/O operations. If this gets stuck or overloaded, this can
prevent other blocking I/O using the HTML filesystem API from making
progress. This can lead to the files app failing to show any files or
mounts.

In particular, there are two cases known to cause this:
1. A large copy (e.g. Linux kernel source) is made from Downloads to
   Drive. Previously, this triggered many read directory requests to
   Drive, clogging the single shared task runner as the repeated scans
   with stat calls for each file/directory are not particularly fast.

2. A filesystem hangs on an I/O operation (simulated via a DriveFS
   modified to never respond to FUSE read requests).

Switch the ChromeOS FileSystemBackend to create a task runner per
operation for native filesystems that require blocking I/O.

Bug: 904658, 943886
Change-Id: I531fe038fd7ccc2b213835bea29b685081f3b27b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1531925
Commit-Queue: Noel Gordon <noel@chromium.org>
Reviewed-by: Noel Gordon <noel@chromium.org>
Reviewed-by: Luciano Pacheco <lucmult@chromium.org>
Cr-Commit-Position: refs/heads/master@{#642843}
4 files changed