Remove typo from escape code char.

Shouldn't be a ' in there..
Add data table to bytecode.

Data is just strings -- so, there are two ways to use it in the
assembly:

1. defdata data_name "data"
2. Using "data" inline.

If using the former, the data can be referenced later by using a data
ref. Data refs are just identifiers prefixed by a tilde, so doing

defdata foobar "baz"
load 4 ~foobar

Will load foobar's data ID into the fourth register. Use "baz" after
defining the data will still refer to foobar's data, as duplicate data
entries are squashed.

So, the above is basically equivalent to

load 4 "baz"

The data blocks get associated with read-only memory blocks in the VM,
so they can be peeked as needed. However, because they're read only,
it's necessary that they be copied to avoid errors. Right now, there's
just an std::abort call in there to crash the entire thing because
there's no real recovery from trying to write to read-only memory in
Rusalka.

I'll add memdup and memlen instructions to duplicate blocks and query
block lengths so it's easier to work with them in the future.

Also, because the read-only thing is new, it's now also worth noting
that every block must include a request for memory permissions. If the
block doesn't provide those permissions, that triggers the abort.
Add test string print callback.

Also fix the vm_test code because the vm_state_t takes ownership of
source objects.