Fix ENOENT on shared build steps from stale log path
A finished build log was parked in the Readonly state holding its
in-progress path, but the store renames the build directory into place
on success. A late-joining log tailer (e.g. a sibling build sharing a
deduplicated step) reopening that path after the rename hit
ENOENT (..., "open", ".../in-progress/<id>/log").
Retain a read-only dup of the fd in the finished state and read from it
instead of reopening by path; the fd follows the file through the
rename. On Windows the fd must be closed before the directory can be
renamed, so it keeps reopening by path there.
Add a regression test asserting a finished log stays readable after its
directory is renamed.