Improve reporting on recrawls

Summary:
Adds a `warning` field to the response struct.  If present, it conveys
a warning that should be reported back to the user.

We currently only set this warning state if a recrawl is triggered.  The
warning output links to new documentation about what a recrawl is and how to
avoid it.

We maintain a recrawl counter but don't expose this in a structured way to the
client.  Not sure how big a deal this really is; given @sid0's recent change to
heal for non IN_Q_OVERFLOW conditions, this should only trigger when the
inotify resources are not tuned properly and thus this should be pretty much a
binary condition.

Test Plan:
`make integration`; tests that trigger recrawls assert that we set
the warning info.

The warning field looks like this:

```
Recrawled this watch 1 times, most recently because:
/private/var/tmp/bwx0ydi87bscgkc0: debug-recrawl
To resolve, please review the information on
https://facebook.github.io/watchman/troubleshooting.html#recrawl
```

Reviewers: fsilva, sid0

Reviewed By: sid0

Subscribers: sid0, jimp, dreiss

Differential Revision: https://phabricator.fb.com/D1488381
Poison ourselves when the kernel cannot watch a dir

Summary:
if the kernel resources are exceeded when watching a dir we
owe it to our clients to report that this has happened rather than
misleading them about the state of the tree; if we can't watch a dir
then we can't see inside it or reason about changes therein.

This diff adds support for setting the process into a poisoned state
when the kernel fails to watch a dir due to system limits (ENOENT is
excluded from this case as we can simply look at the filesystem again
to recover).

When in a poisoned state, all commands to the server will fail, unless
the command is marked as being immune to the poison state
(`shutdown-server` is the only one that is immune).

Depends on D1488381

Test Plan:
tested manually because I don't want to poison the test
harness and I'm slightly too lazy to spawn a new instance just to poison
it:

```
$ PATH="$PWD:$PATH" ./watchman watch .
{
    "version": "2.9.9",
    "watch": "/net/192.168.0.1/Users/wez/fb/watchman"
}
$ PATH="$PWD:$PATH" ./watchman watch-list
{
    "version": "2.9.9",
    "roots": [
        "/net/192.168.0.1/Users/wez/fb/watchman"
    ]
}
$ PATH="$PWD:$PATH" ./watchman debug-poison $PWD
{
    "version": "2.9.9",
    "poison": "A non-recoverable condition has triggered.  Watchman needs your help!\nThe triggering condition was at timestamp=1407697279: debug-poison(/net/192.168.0.1/Users/wez/fb/watchman) -> Cannot allocate memory\nAll requests will continue to fail with this message until you resolve\nthe underlying problem.  You will find more information on fixing this at\nhttps://facebook.github.io/watchman/troubleshooting.html#poison-debug-poison\n"
}
$ PATH="$PWD:$PATH" ./watchman watch-list
{
    "version": "2.9.9",
    "error": "A non-recoverable condition has triggered.  Watchman needs your help!\nThe triggering condition was at timestamp=1407697279: debug-poison(/net/192.168.0.1/Users/wez/fb/watchman) -> Cannot allocate memory\nAll requests will continue to fail with this message until you resolve\nthe underlying problem.  You will find more information on fixing this at\nhttps://facebook.github.io/watchman/troubleshooting.html#poison-debug-poison\n"
}
$ PATH="$PWD:$PATH" ./watchman shutdown-server
{
    "version": "2.9.9",
    "shutdown-server": true
}
```

Reviewers: fsilva, sid0

Reviewed By: sid0

Subscribers: jimp, dreiss

Differential Revision: https://phabricator.fb.com/D1488396