differentiate path types using pathlib
Change most of filename variables to use pathlib's Path or PurePath. The benefit of this is not so much in using those pathlib objects. It is knowing what we talk about. The Path type is used for filenames that actually may exist when looked at from the host system. When a variable of type Path refers to a file inside the chroot, it includes the chroot prefix (Chroot.name). In contrast, filenames that lack this prefix (and thus cannot be operated on directly) become PurePath. In particular, the Chroot.relative method that turns a path inside the chroot into a host path now consumes a PurePath and returns a Path. The type checker now also tells when mixing paths and str. Yes, this adds a bit verbosity all over the place due to having to convert between these types explicitly. In particular, arguments to run need to be converted using os.fspath. Hopefully, this explicit conversion makes the code easier to reason about.