replace file monitors with a single monitor

This allows us to make sure events are fired in the correct order.  If we switch to inotify, we can revert to something similar to the old implementation.