Handle the case of files with the same content but different permissions...

....

We do this by adding the octal mode string to the content store key.
It's pretty straightforward, but this did involve moving some classmethods
from GitShed to ContentStore, to keep all key-related methods in one place.

Also switched to a better way of getting a file's mode (.st_mode instead of
[stat.ST_MODE]. It turns out that the latter is just a legacy, and the former
is the cool way to access the mode from the stat struct.

Note that this change breaks existing gitshed files, as their keys are
now different! I plan to migrate our existing gitshedded repo by unmanaging
all files, then upgrading to the new gitshed, then re-managing, then
committing all of the above in a single commit.