cmd/go/internal/modfetch: lock files and directories
We employ the following new locking mechanisms:
• Zip files and list files within the module cache are written using
atomic renames of temporary files, so that GOPROXY servers reading
from the cache will never serve incomplete content.
• A lock file for each module version guards downloading and extraction of
(immutable) module contents.
• A lock file alongside each version list (named 'list.lock')
guards updates to the list.
• A single lock file in the module cache guards updates to all go.sum
files. The go.sum files themselves are written using an atomic
rename to ensure that we never accidentally discard existing sums.