Add phlsys_fs.lockfile_context()

Support exclusive operations on the filesystem in a similar way to git -
using lockfiles.

The drawback to this is that it's possible to 'leak' the lockfile if the
program is forcibly terminated or exits at 'just the wrong time'.

Test Plan:
exercise lockfile_context() using testbed/lockfile/run.sh, this
simulates multiple writers contending for the same resource in a tight
loop.

Observed that occasionally a lockfile is left behind after killing the
writer processes.
phlsys_fs: add lockfile_wait_context()

Make it easier to work with lockfiles by providing a retry loop helper
for polling on a lock if it cannot be acquired.

Rewrite lockfile tests to take advantage of the more convenient method.

Test plan:
$ ./precommit.sh

Check that new tests finish all jobs
./testbed/lockfile/run_loopers.sh
./testbed/lockfile/run_singles.sh
Add abdt_fs.lockfile_context, update 'arcyd add*'

Make it possible to run multiple 'arcyd add*' operations at the same
time without worry of making the filesystem inconsistent.  Use
phlsys_fs.lockfile_retry_context() to ensure that operations are
exclusive.

Test Plan:
$ ./precommit.sh
Arcyd: refactor, mv repo config parsing to 'start'

Make it possible to do all disk access to repository config files for
'arcyd start' before doing abdi_processrepos.process().

This makes it possible to get a lock on the repository config files
at the top-level of the program and release it before descending into
the arcyd daemon details.

Test Plan:
$ ./precommit.sh
Exclusive fs during arcyd start and stop

Make it possible to start and stop arcyd arbitrarily without the
possibility of running during an 'arcyd add-*' operation or starting
while we're starting, or stopping while we're starting etc.

Test Plan:
$ ./precommit.sh
Exclusive fs during 'arcyd rm-repo'

Make it possible to run 'arcyd rm-repo' without needing to ensure that
'arcyd start/stop/add-*' is being run at the same time; to avoid leaving
the file system in an inconsistant state.

Test Plan:
$ ./precommit.sh
Exclusive fs during 'arcyd fsck'

Run consistency checks and fixes without needing to ensure that
'arcyd start/stop/add-*' are not running at the same time.

Test Plan:
$ ./precommit.sh
Exclusive fs during 'arcyd fetch'

Make it possible to 'arcyd fetch' without needing to manually ensure
that no other arcyd commands are being run at the same time.

Abort if arcyd is currently running to avoid introducing cache
inconsistencies.

Test Plan:
$ ./precommit.sh
Exclusive fs during 'arcyd list-repos'

Make it possible to 'arcyd list-repos' without needing to manually ensure
that no other arcyd commands are being run at the same time.

Test Plan:
$ ./precommit.sh