ce42b372

Say what a path is

First of the stack. #13, #11 and #12 sit on this.

A `FilePath` is a `String`, so nothing about it says whether it holds a file or a directory, whether it is absolute or relative, or whether it is a path at all. The specs here named one twenty times: `resourceDir` was a `String` in eight of them, and three separate copies of `rootAt` took one.

They take `path`'s `Path` now, and ask `path-io` for the listings. Where a library wants a `String` it gets `toFilePath` at the call, which is the one place a path should be spelled that way.

## Three things that fell out

**`hopinion-gen` no longer depends on `directory`.** `listDirRel` answers with the directories and the files already told apart, which is what every one of these listings wanted. Several assertions that compared sorted strings now compare `Path` values and say which kind they expected:

```haskell
-- before
entries <- listDirectory resourceDir
sort entries `shouldBe` ["every-kind.golden", "failure.golden", "repo"]

-- after
(dirs, files) <- listDirRel resourceDir
sort dirs   `shouldBe` [[reldir|repo|]]
sort files  `shouldBe` [[relfile|every-kind.golden|], [relfile|failure.golden|]]
```

**`Project.hs` compared a directory's name against two words.** It compares directories now, so the trailing separator that made `dropTrailingPathSeparator` necessary is not in the way.

**sydtest moves to 0.30.0.0**, where `scenarioDir` hands over a `Path Rel File` rather than a `FilePath`. That is what the two scenario-driven specs needed, and it is why the pin moves in a commit that otherwise only touches this repository. NorfairKing/sydtest#137.

## No rule yet

Nothing enforces any of this here. That is #13, and it is separate because this is a change to existing code and that one is not: after this, #13 adds a rule file, the fact it reads, and its test resources, and touches nothing that already existed bar the line that registers it.

178 tests, unchanged in count: nothing here adds or removes a test, it retypes what they pass around.

## Review loop

```
nix flake check
nix develop --command cabal test hopinion-test --test-options="--ai-executor"
```