Detects scan cycles through symlinks without blocking valid external links.

  $ mkdir -p c1
  $ (cd c1 && ln -s . x)
  $ (cd c1 && ln -s . y)
  $ (cd c1 && dune build)
  Error: Path . has already been scanned. Cannot scan it again through symlink
  x
  [1]

  $ mkdir -p c2/a c2/b
  $ (cd c2/a && ln -s ../b x)
  $ (cd c2/b && ln -s ../a x)
  $ (cd c2 && dune build)
  Error: Path a has already been scanned. Cannot scan it again through symlink
  a/x/x
  Error: Path b has already been scanned. Cannot scan it again through symlink
  b/x/x
  [1]

  $ mkdir symlink-outside-root
  $ (cd symlink-outside-root && ln -s ../sample-exe sample)
  $ (cd symlink-outside-root && echo "(lang dune 1.0)" > dune-project)
  $ (cd symlink-outside-root && dune exec --root . -- sample/foo.exe)
  foo

  $ mkdir -p symlink-outside-root2/root
  $ mkdir -p symlink-outside-root2/other/a
  $ mkdir -p symlink-outside-root2/other/b
  $ (cd symlink-outside-root2/other/a && ln -s ../b x)
  $ (cd symlink-outside-root2/other/b && ln -s ../a x)
  $ (cd symlink-outside-root2/root && ln -s ../other src)
  $ (cd symlink-outside-root2/root && dune build)
  Error: Path src/a has already been scanned. Cannot scan it again through
  symlink src/a/x/x
  Error: Path src/b has already been scanned. Cannot scan it again through
  symlink src/b/x/x
  [1]

  $ mkdir -p symlink-outside-root3/root
  $ mkdir -p symlink-outside-root3/other
  $ (cd symlink-outside-root3/root  && ln -s ../other src)
  $ (cd symlink-outside-root3/other && ln -s ../other foo)
  $ (cd symlink-outside-root3/root && dune build)
  Error: Path src has already been scanned. Cannot scan it again through
  symlink src/foo
  [1]
