Push implementation using the native Git pack transfer service.
This is the canonical implementation for transferring objects to the remote repository from the local repository by talking to the 'git-receive-pack' service. Objects are packed on the local side into a pack file and then sent to the remote repository. This connection requires only a bi-directional pipe or socket, and thus is easily wrapped up into a local process pipe, anonymous TCP socket, or a command executed through an SSH tunnel. This implementation honors Transport.get_PushThin option. Concrete implementations should just call BasePackConnection.init(System.IO.Stream,System.IO.Stream) and BasePackConnection.readAdvertisedRefs methods in constructor or before any use. They should also handle resources releasing in BasePackConnection.Close method if needed.