Improve submodules status data caching and compatibility

Submodule status is not tested very thoroughly in the test suite, it turns out, particularly when the submodule data is modified on disk underneath the cached submodule object - and the caching is pretty aggressive. Also, the actual tests of dirty submodules don't cover all the cases that should count as dirty. Lastly, the testing of the various submodule "ignore" flags that influence status is poor.

- [x] add more tests of submodule status with dirty working directory 
- [x] add more tests of submodule status where the submodule is changed after initial caching
- [x] fix broken submodule data caching
- [x] add more tests of submodule ignore values for status
- [x] add a diff option for a custom ignore value (previously there was only a toggle to turn on "ignore all")
- [x] test submodule ignore options for diff

The main user-visible outcomes from this PR are:

1. more expected behavior for submodules in status, and
2. a new `ignore_submodules` option in the `git_diff_options` that can be set to any `git_submodule_ignore_t` value to override the per-submodule config options. For example, you can now pass in `GIT_SUBMODULE_IGNORE_DIRTY` and submodules where the only change is a dirty working directory will now be consider UNMODIFIED.

Also, obviously, the test coverage for these features is improved so hopefully we'll see fewer problems and fewer regressions going forward.