Reintroduce deferred syntax checking

The removal of deferred checking caused Flycheck to conduct a syntax
check on each change of the window configuration, even if totally
unrelated buffers where affected.  For instance, Flycheck would check
each time the user executed `magit-status`.

This is certainly much too aggressive.  Thus we reintroduce deferred
checking.  It's a more complicated approach, but much nicer and less
aggressive.

This reverts commit 7a5a36429ccf90501ab4c7f8e7613e7b09bd6ded.