builtin/exit: exit immediately

Closes: https://github.com/emersion/mrsh/issues/37
jobs(1): add support for jobs [job_id...]

Also prints the previous job indicator (-) since this touched the
relevant code anyway.
test: fix incorrect $? in async test
shell/task/word: fix $!
test: enable all pipeline tests
shell/job: fix job ID not incremented
shell/task/pipeline: don't leak next stdin FD

Closes: https://github.com/emersion/mrsh/issues/95
jobs(1): randomly print "Stopped" or "Suspended"

The string used is unspecified between these two options, so this
prevents a particular one from being relied upon.
jobs(1): job_state_str: add parenthesized info

This completes the jobs(1) implementation.
jobs(1): implement -l, -p flags
jobs(1): implement <current> marker
job_by_id: add job id by command

This completes the XBD job control ID implementation.
builtin: add very basic jobs implementation

This only displays a list of all jobs for now. No options are supported, the
status and current columns are only partially implemented.
ast: add mrsh_node_format

This formats an AST node into a string.

Formatting is necessary for e.g. jobs(1).
build: add `make mrproper` to remove all generated files
shell/job: store AST node in job

Updates https://github.com/emersion/mrsh/issues/1
ast: introduce mrsh_node_destroy
ast: introduce mrsh_node_copy
gitignore: don't ignore include/mrsh

But ignore the mrsh executable produced by make(1).
shell/job: ignore terminated jobs in job_by_id

This fixes fg and bg when they operate on the current or previous job.