Mounting a local repository onto its own directory caused the FUSE
server to read its own backend files through the mount it had just
created, deadlocking the kernel. `umount` then reported "Device or
resource busy" and recovery required a reboot that took several
minutes. The same shape occurs when the mountpoint is nested inside
the repository directory, or when the repository directory is nested
inside the mountpoint.
The mount command now resolves both paths via filepath.Abs and
filepath.EvalSymlinks and refuses with a fatal error if either path
equals or contains the other. The check runs before the repository
lock is acquired so an overlap fails fast. Only the local backend is
checked; remote backends cannot shadow the mountpoint directory.
Rough steps:
```
mv cmd/restic/global* cmd/restic/secondary_repo* internal/global/
sed -i "s/package main/package global/" internal/global/*.go
Rename "GlobalOptions" to "Options" in internal/global/
Replace everywhere " GlobalOptions" -> " global.Options"
Replace everywhere "\*GlobalOptions" -> " *global.Options"
Make SecondaryRepoOptions public
Make create public
Make version public
```
The tests are now split into individual files for each command. The
separation isn't perfect as many tests make use of multiple commands. In
particular `init`, `backup`, `check` and `list` are used by a larger
number of test cases.
Most tests now reside in files name cmd_<name>_integration_test.go. This
provides a certain indication which commands have significant test
coverage.