Implement `table.move(a1, f, e, t [,a2])`.
The implementation copies elements `a1[f..e]` to `a2[t..t+(e-f)]`
defaulting `a2` to `a1` and returning `a2` as follows:
* empty ranges (`e < f`) are "no-op",
* for in-table copies where `t > f` loop backwards to prevent unread
source slots from being clobbered before they are read (note: the only
case where overlap is destructive,
* cross-table copies always run forwards since there is no aliasing.
Add test suite that covers:
* non-overlapping copies,
* cross-table copies,
* both overlap directions,
* same position identity,
* empty ranges, and
* single element moves.
Each of the above is tested with both scalar and nested-table values.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>