Add 'dump' command option '--recorded-metadata' to dump address/length of raw tracee data recorded
Introduce PropertyTable and Property<T> and use them to store per-Task execve syscall state.
Acquire syscall_state on every syscall entry and exit
Make syscall_state_property methods take a Task.
Move saved_args out of Syscall event into syscall_state.
Move tmp_data_ptr/tmp_data_num_bytes from Syscall event to TaskSyscallState.
record_noop_data is no longer needed.
Remove no-longer-needed #includes.
Make Registers::set_arg accept a dynamic argument index
Add Registers::arg(int) to get a register by dynamic argument index.
Create generic framework for creating scratch records and automatically restoring/recording them on successful syscall exit, and use it for waitpid/wait4.
Use new scratch infrastructure for 'splice'.
Use new scratch infrastructure for 'sendfile'
Make TaskSyscallState support recording out-args when we're not using scratch (because the syscall does not block), and use that to unify fcntl(64) handling.
Use TaskSyscallState for futex args.
Make TaskSyscallState support mutating a pointer in memory to point to scratch data, and use that to convert ipc/msgrcv/msgctl to use TaskSyscallState.
Major rework of the TaskSyscallState machinery.

Now we handle memory parameters pointed to by other memory parameters, and
relocating arbitrary pointer graph structures to scratch space. We also handle
dynamic parameter sizing, where the amount of data to record depends on
the syscall result value or the contents of some memory location.
There's a slightly hacky solution to the problem of allocating a single
"bytes read" syscall result to multiple iovec structs.

The new machinery lets us describe syscall memory parameters in a general
way before we decide whether to ALLOW_SWITCH and before we decide whether
to use scratch memory. In done_preparing we decide whether to ALLOW_SWITCH
and use scratch memory, and if we are using scratch memory, it's all set
up there. Then in process_syscall_results (called when the syscall exits)
the saved description of syscall memory parameters is used to perform
all necessary recording and restoration of redirected register parameters.
Thus with the new machinery, rec_prepare_syscall_arch (or its callees)
are entirely responsible for defining how a syscall is recorded. This
reduces code duplication.

The new machinery checks that whenever a pointer in memory is modified
to point to a scratch buffer, the pointer's memory address is itself
in an area that has been relocated to scratch. This ensures that non-
scratch memory is never modified.

All socketcall/recv(m)msg/send(m)msg and related syscalls are rewritten
to use the new machinery.
Declare variables at first assignment
Update 'select' syscall to use new TaskSyscallState infrastructure
Update read syscall to use new infrastructure