Fix :Git! on Windows.

Closes #301, #302.
Unify escaping rules for :Gedit with :edit

In particular, this makes `:Gedit file\ with\ spaces` work, and updates
the tab complete to match.

Closes #305.
Work around archaic encodings

Closes #304.
Add foldlevel to fugitive_diff_restore
Expose detect interface

Closes #311.
Fix Vim filename escaping for StageDiff + more

* Filename arguments to Gedit should not be escaped, as s:Edit already
  s:fnameescape()s when passing filenames to the next command.

  Fixes:

    A filename with a Vim metacharacter in the Gstatus window cannot be
    diffed via StageDiff because it becomes double escaped:

        #	modified:   etc/%mutt/muttrc

    Pressing 'D' on this line opens two new buffers:
         t/muttrc           (filename shifted by length of repo().dir())
         etc/\%mutt/muttrc  (one actual backslash)

* s:shellesc should pass an optional {special} argument to
  shellescape() when it is used to sanitize filenames for Vim functions
  and not direct system calls. Vim commands will do one more pass over
  the filename and erroneously expand metacharacters like '%'

  Fixes:

        #	modified:   etc/%mutt/muttrc

        This same file cannot be processed correctly by s:StagePatch or
        s:StageDiffEdit. Pressing 'p' on this line results in "No
        changes." from git, and pressing 'dp' results in:

        fatal: ambiguous argument 'etc/README.markdownmutt/muttrc' ...

        Where README.markdown is the current active buffer, replacing
        the '%' in the filename.