watchman: fsevents: propagate errors from fsevents thread init

Summary:
We've seen a handful of issues where something goes bad with
the fsevents subsystem and the underlying watch is effectively broken
because it wasn't properly initialized.  This is exacerbated because
the failure is asynchronous with respect to watch establishment.

This diff synchronizes fsevents initialization with the rest of the
root initialization and adds a `failure_reason` to the root that can
be used to propagate an error message back from the other thread.

It also improves error handling for fsevents initialization failures.
Unfortunately there doesn't appear to be a way to capture the underlying
reason for the error from the library calls, so all we can do is
set the reason to the failing function.  The library calls do emit
a log line to the log file.

The watch command is augmented to inspect the `failure_reason` and
`cancelled` fields of the root and return an error.

Depends on D28167

Test Plan:
`make integration` shows that this works.

I injected a failure in fsevents initialization, then:

```
$ ./watchman watch .
{
    "version": "2.9.9",
    "error": "womp"
}
```

Previously, this would report the watch as successful and then (maybe) cancel it.

Reviewers: sid0

Reviewed By: sid0

Differential Revision: https://reviews.facebook.net/D28179