Mostly implement break and continue builtins

The main thing that's missing here is moving the number of loops into
the call stack:


To prevent you from breaking out of your caller's loop in a function.
parser: fail on invalid parameter

POSIX says '$' followed by an invalid character is unspecified behaviour. Make
the parser fail instead of handling it as a string.

This diverges from the dash implementation.

Fixes: aff5a58f0f99 ("parser: handle `$` followed by invalid char more gracefully")
parser: handle `$` followed by invalid char more gracefully

e.g. `$ ` and `$\n`

POSIX says it's undefined behaviour.

Closes: https://github.com/emersion/mrsh/issues/13
test: disable pipeline test with subshell
ci: use auto_features flag
test: add pipeline

The two last tests are disabled because they don't pass.
(Partially) implement job control IDs
Implement $! expansion
Implement 'wait' builtin
Add command -v builtin.
Fix builtins I/O redirections

A out-of-bounds array access has been introduced in
Flush stdout/stderr after executing builtins

When stdout/stderr are set to a pipe, they're not flushed on newlines. This can
result in out-of-order output. For instance:

    command ls
    echo middle
    command ll

Since echo flushes its output before exiting, the output of the first builtin
call will appear after echo's.

The solution is to flush stdout/stderr after builtins have been executed.

dash does the same thing.
Remove job_{terminated,stopped}, superseded by job_poll
Fix executing multiple commands at once in an interactive shell
Restore signal handlers in subshells
builtin/fg: move background jobs, not stopped jobs

From the POSIX spec:

> the fg utility shall move a background job from the current environment into
> the foreground
Create a job when executing a subshell
Introduce job_poll
Only create jobs if job control is enabled