Several diff and status fixes

This groups together a number of fixes for status and incidentally for diff, too.

1. Implement the requested `GIT_STATUS_OPT_RECURSE_IGNORED_DIRS` feature and provide an actual implementation for `GIT_DIFF_RECURSE_IGNORED_DIRS` which was not actually working
2. Implement `GIT_STATUS_OPT_EXCLUDE_SUBMODULES` which was sitting unimplemented for a long time. This includes fixing a fairly broken `GIT_DIFF_IGNORE_SUBMODULES`.
3. Fix some diff and status bugs reported in #1425 with how ignored directories were being processed and with detecting submodule changes where only the files in the working directory of the submodule had been modified.
4. As part of 3, change the behavior of ignored directories so that they will be included in diff results when you ask to include ignored items even if they are contained in an untracked directory. This means our behavior for reporting ignores will now differ slightly from core git (see `test_status_ignore__subdirectories` for more details), but I'm now convinced that the new behavior will make more sense (/cc @nulltoken who had previously asked for this change).

I think this PR will resolve a couple of open status issues and should supercede PR #1251 (by implementing `GIT_STATUS_OPT_RECURSE_IGNORED_DIRS` as discussed in that PR).