shell/task: fix subshell exit status
shell/task: fix last_status
shell/task: add pipelines
shell: document subshell_fork
shell/task: add function definition
shell/task: add case clause
shell/task: add for clause
shell/task: add loop clause
shell/task: add if clause
shell: fix subshell_fork error return value
shell/task: add proper builtin support
shell/task: implement work tasks
shell/job: add job_wait_process
shell/task: re-implement very basic shell
shell/task: remove

This will get replaced with much simpler code.
test: add word.sh
test: rename word.sh to syntax.sh
test: don't clutter logs with env
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