Add a bunch of stuffs to Index.Improve()

With this PR, it is now possible to:
- [X]  Pass `ExplicitPathsOptions` to `Index.Remove()`
- [X] Remove whole folders from the index
- [X] Remove files/folders from the index without removing them from the workdir (`git rm --cached`)

This fixes #270 and #327.

Please note that the behavior is now consistent with `Index.Stage()/Unstage()`:
- passing pathspecs which don't match any files does **not** throw anymore.
- passing explicit paths (by passing a non-null `ExplicitPathsOptions`) which don't match any files **will** throw.

This is a breaking change.