Make Index.Remove() diff-based

Note: it means that the paths passed to Remove() are pathspecs, and thus behavior has been aligned with Stage()/Unstage() => calling Remove() by passing a pathspec which doesn't match any paths doesn't throw anymore (breaking change).
Allow passing ExplicitPathsOptions to Index.Remove()

This makes the behavior fully consistent with Index.Stage()/Unstage().
Make Index.Remove() able to remove folders

Fixes #327
Make Index.Remove() able to remove only from index

Fixes #270
Improve support for git rm --cached semantics

Lots of test cases added, to mimic git rm --cached behavior.
Move Index.Remove() tests to a separate file