Support shallow clones in dulwich

Support shallow cloning against repos served by dulwich and support shallow repos.

Shallow repos are defined by having a shallow file in the git directory describe the shallow boundary of the repos. These repos are typically created by making shallow clones of existing repos (git clone --depth=#).

The shallow clone invocation is described here https://www.kernel.org/pub/software/scm/git/docs/git-clone.html.

The pack-protocol description of shallow is described here https://www.kernel.org/pub/software/scm/git/docs/v1.7.0.5/technical/pack-protocol.txt