Rework git logic for determining in-sync and current ref name Rework two aspects of the logic for git repositories; both of these can change behavior in some cases when printing status: 1. Determining whether the local checkout is in-sync with the expected reference from the configuration file: Now we always convert the expected reference to a hash and compare that with the currently-checked-out hash. Previously, we sometimes did the comparison using names, e.g., just ensuring that you're on the right branch. 2. Determining the current ref name (e.g., the branch or tag currently checked out). Now we use a number of plumbing commands rather than relying on regex parsing of 'git branch -vv'. The previous regex parsing was fragile and hard to maintain, and was the source of a number of bugs. In addition, differences between git v. 1 and git v. 2 meant that the result was incorrect in some cases - particularly, in the case where we have "detached from foo" (which is the text that always appeared for a detached head in v 1, but in v 2 means we are no longer at foo). This results in some subtle changes to status output. One particular change is: If we're on a tracking branch, `checkout_externals -S -v` will show the name of the local branch rather than the tracked branch. (This is more accurate, because we may not actually be at the head of the tracking branch.) Also some other minor changes to documentation and running code coverage.