Major improvements to path compression functionality.

The existing path compression code was cool, but there were still
corner cases where it failed or looked ugly. No more!

* Move ~ replacement into compressPath().
* Never collapse the last segment of the path.
* If the path is still too long after collapsing all segments, just
chop off the start drop the everything before the first ellipsis (or
add and ellipsis if none exists).
* Always call compressPath() and always calculate the filler length,
instead of using conditionals to figure out when to do what. This also
allows compressPath to return better-looking-but-shorter-than-
requested paths in some extreme scenarios.
* Make all variables local.
* Use integer variables for clarity.
* Add comments to some of the more confusing bits.
Bind ctrl+Z to bring background processes to the foreground.

Pretty handy when paired with the ctrl+Z binding to send Vim to the
background.
User more integer variables and arithmatic tests throughout prompt code.

I just found out about these, but I like them.
Change the arrows used for git-ahead-behind.

When upgrading to my new OS, the arrow characters that I use for
indicating whether I'm ahead or behind the upstream branch went from
being fixed width to being more than a single column wide, which
looked really quite bad. Not sure why that happened, but these new
arrows always seem to be the same width.