reap message enhancement for signals vs. exit codes

- If the process exited due to a signal, set the exit_code to the
-<SIGNAL> value to match the behavior of the Popen.returncode attribute
that is used in the other reap message.
This allows plugins that monitor the exit of processes to distinguish
between an actual return code > 0 and an exit due to a signal (i.e. a
segfault, SIGILL, SIGABRT, etc.)
Add a new stream class - WatchedFileStream

- This stream class emulates the behavior of Python's WatchedFileHandler
logger utility, where if the log file is removed/renamed by an
external log rotation utility, the file will be reopened. This is very
useful for situations where circus is running a bunch of different
processes with different logging implementations and one external log
rotation tool is used so that all the different logging implementations
don't have to worry about log rotation.

- refactored common FileStream functionality into a base class that is
now shared between FileStream and WatchedFileStream.
import WatchedFileStream so it's name is resolvable

- Allow users to specify WatchedFileStream in config files without a
fully qualified name.
- Suppressed the flake8 warning for an unused import as
WatchedFileStream needs to be in the globals dict
Add WatchedFileStream tests in that mirror what is tested for FileStream
Add docs for WatchedFileStream
switch loggers from using FileHandler to WatchedFileHandler

- This change makes a seamless switch to using WatchedFileHandler
instead of FileHandler for the main logger and the builtin plugins.
If a system log rotation utility moves the circus log, circus will
continue to function fine when logging.

The only downside is a slight performance hit as WatchedFileHandler
stats the log file on each log call, but it seems like a good tradeoff
for a systems tool like circus to help ensure that the circus logs never
cause problems.