Add `Inplace`, a wrapper around `NameGen` that exposes an ordinary monadic interface.
Add `Inplace`, a wrapper around `NameGen` that exposes an ordinary monadic interface.

Unlike `NameGen`, `InPlace` maintains the same scope parameter even as we
generate new names. This lets us implement ordinary `>>=/return` instead of the
parameter-changing `bindG/returnG`. We update the meaning of the scope parameter
"in-place", automatically injecting all values into the larger scope as we add
names. We ensure correctness by meeting two conditions (1) we only change the
true underlying scope parameter by fresh extension and (2) we only allow access
to covariant data satisfying the `InjectableE` constraint, meaning that it can
be injected by coercion.

This should make for a more convenient builder interface. For example, here's
adding three numbers with a NameGen-style builder.

```
add :: Builder m => Atom n -> Atom n -> m Atom n
add = ...

add3 :: Builder m => Atom n -> Atom n -> Atom n -> m Atom n
add3 x y z =
  add x y   `bindG` \tmp ->
  injectG z `bindG` \z' ->
  add tmp z'

```

And here's the in-place version. It uses an ordinary monad instead of
bindG/returnG, and it avoids the injection, because that happens implicitly:

```
add :: Builder m => Atom n -> Atom n -> m n Atom
add = ...

add3 :: Builder m => Atom n -> Atom n -> Atom n -> m n Atom
add3 x y z = do
  tmp <- add x y
  add tmp z
```

google-research/dex-lang,google-research/dex-lang,google-research/dex-lang,google-research/dex-lang,google-research/dex-lang,google-research/dex-lang