canary.lua: Simple old-fashioned heap corruption debugging tool.

Lets you place blocks of memory with well-defined contents -
"canaries" - around the heap and detect if they are overwritten.

selftest looks like this:

    $ ./snabbswitch -t canary
    Checking with live canaries..
    Checking with dead canaries..
    canary 'canary #1' died. Stomach contents:
    ff 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
    10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
    20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
    30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f

    canary 'canary #2' died. Stomach contents:
    00 ff 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
    10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
    20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
    30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
canary.h, canary.lua: Improvements.

Moving 'struct canary' into a .h file makes it easy to use inside C
struct declarations in other .h files.

canary.lua now marks exactly which bytes have unexpected values.
packet.h: Added missing semicolon.
virtio.lua: Implemented multi-buffer receive.
virtio.lua: Fixed a bug.
Now successfully echo'd a ping flood for 10 minutes.
There is a problem with multi-buffer packets.
memory.c: compile fixes
ec2: Trying mmap without MAP_HUGETLB.