unify watcher cleanup
cleanup doesn't throw anyway
reshuffle methods for readability
reject things that don't look like valid hashes