Fix some observed problems with incorrect diffs

A couple of circumstances where incorrect diffs are being generated have come up.

1. The `GIT_DIFF_REVERSE` flag has been broken for a long time when it came to generating actual text diffs. The list of deltas was largely correct, but the logic for loading data was wrong and led to the incorrect text diff being generated. This fixes that.
2. The `git_diff_merge()` API worked incorrectly on reversed diffs. Once I wrote some tests, it was easiest to just write an entirely separate helper function for that to merge reversed deltas.
3. It is very easy to inadvertently diff with stale index data in the real world. This was compounded by the fact that I've told people that `git_index_read()` does a soft reload the index data (i.e. only reloads the data if the file on disk has changed), but that was not actually true - it always reloaded the data and discards in-memory changes. This PR addresses this problem via three changes:
    * Add a `force` parameter to `git_index_read()` to force reloading of on-disk data or to only reload when the index file was externally modified outside of libgit2
    * Make the diff functions that use the index automatically do a soft reload if they are not given an explicit index and are calling `git_repository_index` themselves internally
    * Add a flag to status that can prevent this soft reload from being done if preferred
4. The `git_diff_options` requires very particular initialization to work correctly, so add an extra helper to initialize it if the static initializer is not an option. Also, fix the fact that the submodule ignore override was being initialization with an invalid enum value.
5. Diff support for "assume unchanged" flags on files has been broken for a while. I finally got around to writing a test for it and fixing the implementation. The implementation is still poor because we should be able to avoid stat'ing files in the working directory and with the iterator based approach, that is difficult if not possible, but at least the results will now match those of core Git.