162458ac

Let a scenario carry whether it is a file or a directory

Reopens #136, which GitHub will not let me reopen: I merged it while you were still reviewing, and master has been reset back off it.

`scenarioDir`, `scenarioDirRecur` and `scenarioDirOfDirs` took a `FilePath` and handed the callback a `FilePath`, so the one thing a caller has to know about a scenario, whether it is a file or a directory, was the one thing the type would not tell them. `scenarioDirOfDirs` handing out a directory and `scenarioDir` handing out a file had the same signature.

```haskell
scenarioDir       :: Path b Dir -> (Path Rel File -> TestDefM outers inner ()) -> TestDefM outers inner ()
scenarioDirRecur  :: Path b Dir -> (Path Rel File -> TestDefM outers inner ()) -> TestDefM outers inner ()
scenarioDirOfDirs :: Path b Dir -> (Path Rel Dir  -> TestDefM outers inner ()) -> TestDefM outers inner ()
```

## Relative to the directory given

Not to the working directory. The scenario is then the name to say the test is about, and joining it to the directory is what reads it:

```haskell
let dir = [reldir|test_resources/even|]
scenarioDir dir $ \rf ->
  it "contains an even number" $ do
    s <- readFile (fromRelFile (dir </> rf))
    ...
```

Neither has to be recovered from the other. Handing over the joined path made a caller who wanted the name split it back apart, which is what the `FilePath` version did.

The directory stays polymorphic in its base, so a scenario over a `withSystemTempDir` still works with the absolute path it hands you, which is what this repository's own `ScenarioSpec` does. Pinning the input to `Path Rel Dir` would read more strictly and break that.

## Breaking

The signatures changed rather than gaining typed siblings, so this is a major bump to 0.30.0.0.

Test descriptions are unchanged, separator and all, so a `--filter` over them still selects the same tests.

## The documentation examples

The `it`, `itWithOuter` and `itWithBoth` examples were the other place the docs spelled a path as a string, so they use `path` and `path-io` now too. Two of them did not typecheck as written: they joined the `Path Abs Dir` from `withSystemTempDir` to a `String` with `System.FilePath`'s `</>`. One generated a `FilePath` with `forAllValid`, which mostly generates strings that are not filenames.

## What it bought

`sydtest-test` no longer depends on `filepath`. Joining a scenario directory to a file inside it was the only thing it wanted `System.FilePath` for.

Downstream, NorfairKing/hopinion#13 is what asked for this: `scenarioDir` handing out a `FilePath` forced the type into the signature of everything called from inside one.

## Review loop

```
nix build .#checks.x86_64-linux.release
```

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 19s 19s 20s 0s
Build 20s 6m40s 5m03s 5m23s 0s
Suite 0s 7m00s 5m23s 5m23s 0s

Timeline

0s1m2m3m4m5m