Git speaks one protocol and relies on several underlying transports to make sure the data gets across to the other computer (sometimes it's the same one, but that's mostly irrelevant). The public API should allow you to say git_fetch("git://example.com/git/project.git") or git_push("example.com/git/project.git") and worry about the details so that your wonderful changes get pushed upstream.
So the first step for my GSoC project should be abstracting away the transport-specific details. The push and fetch code doesn't care whether we're talking over an UNIX socket, SSH or directly TCP/IP. A function, say transport_get reads the URL and returns an instance of the appropriate transport. Transports have functions for ls-remote, want/need list sending (the generator lives somewhere else) and object pack sending and receiving. What it is is not much more than a front-end for git-upload-pack in a different thread. The added value is the abstraction of the specific transport protocols.