Implement utils.coalesce(delayMs, callback).
Use fs.watch again for more efficient change detection.

Summary:
The idea of using `fs.watch` instead of `fs.watchFile` has been appealing
ever since we removed the original (buggy) implementation, because file
system events are a much more efficient way to detect changes to the file
system, compared with the polling strategy used by `fs.watchFile`.

There are several major drawbacks to `fs.watch`, however.

First, the `fs.watch` API is inconsistent across platforms. On different
systems, different sequences of events can be emitted in rapid succession,
depending on how the file system decides to represent changes. On OS X the
name of the changed file is not even passed to the callback.

Second, the number of files that can be watched simultaneously, while
relatively high on modern machines, is dangerously within the range of a
project like Meteor.

Third, `fs.watch` cannot be used to watch for changes to files or
directories that do not yet exist. By contrast, `fs.watchFile` has no
trouble polling for non-existent files.

This commit solves these problems by

1. watching only directories, using directory change events as a cue to
   trigger file change events, which has the benefit of reducing the total
   number of simultaneous watches, since there are far fewer directories
   than the total number of files,

2. coalescing directory change events so that only the last event in a
   rapid succession of events actually triggers inspection of the
   directory's contents, and

3. falling back to watching the parent directory if a given file or
   directory does not exist, so that once the file and the intermediate
   directories are created, the corresponding change events will be fired,
   achieving semantics similar to those of `fs.watchFile` without polling.

While I have run this code and verified that it eliminates high CPU usage
and handles file changes correctly, it would definitely be great to add
some tests to prevent regressions.

Fixes #2135.

Test Plan: `meteor run` and try adding/changing/removing files/directories

Reviewers: glasser

CC: nim

Differential Revision: https://phabricator.meteor.com/D922