Make Get-GitDirectory work inside submodules

`git rev-parse --git-dir` shows the relative path to the .git directory,
and even knows how to do this for submodules. This lets us get rid of
our custom logic for finding the .git directory entirely.
Add Get-GitWorkingDirectory

This returns the full path to the root of the Git working directory that
contains the current directory. E.g., if your working directory root is
at C:\dev\MyRepo, and your current directory is
C:\dev\MyRepo\ProjectFoo\packages, Get-GitWorkingDirectory will return
"C:\dev\MyRepo".
Cache Get-GitStatus results to speed up the prompt

Get-GitStatus now caches the last status result and reuses it when
possible. We invalidate the cache when either:
    1. the .git directory changes, or
    2. any files within the .git or working directories change.

We implement (1) by caching the last .git directory for which we
computed status and comparing it to the current .git directory. We
implement (2) by listening for events from System.IO.FileSystemWatcher
objects to find out when any files in the directories we care about have
changed.

Note that this doesn't make Get-GitStatus any faster when it *does* have
to compute status. (And presumably actually makes it a tiny bit slower
because of the extra work to maintain the cache.) But it makes
Get-GitStatus much faster overall since status often doesn't have to be
computed at all.
Merge branch 'pr-52'