Fix optimization options to VBCC.

I was incorrectly passing "-O=3" to the "vc" driver, when
what it really wants is "-O3"; "-O=3" is a lower-level syntax
that means "turn on the register allocator and the optimizer,
but leave off CSE, constprop, DCE, etc., etc.

However, "-O3" gives a strange error message
    ../vbcc/bin/vbccz ... -O=-1 failed
with no other explanation, so we can't use -O3. And -O2 seems to
work, but takes forever (2 minutes, as opposed to 22 seconds for
-O1). So let's go with -O1.

Why can't we keep using "-O=3"? Well, this unsupported combination
of options turns out to have at least one bug:

    struct ObjectData { int link; } objs[500];

    void carry_good(int t, int *p) {
        while (*p != t) {
            struct ObjectData *o = &objs[*p - 42];
            p = &o->link;
        }
        *p = 0;
    }

    void carry_bad(int t, int *p) {
        while (*p != t)
            p = &objs[*p - 42].link;
        *p = 0;
    }

Compiling this code with "vc +z -O=3" and then comparing the
assembly of carry_good() and carry_bad() shows that in the
carry_bad() case, VBCC has incorrectly computed the lifetime
of one of its temps and allocated it to a register that gets
overwritten on the very next instruction. The result: an infinite
loop. This bug is triggered by the "un-pointerify" refactoring
I'm about to perform on ODWY0350 and ODWY0551.

Switching from -O=3 to -O1 gives a 3.5% size improvement on the
.z8 files for ODWY0350 and ODWY0551. I don't observe any improvement
in ODWY0550, which strikes me as weird.
Un-pointerify "base", "link", and "objects".

This change is just a cosmetic improvement; the old code forced
me to repeat the expression ((tt - &objs(MIN_OBJ)) + MIN_OBJ) more
times than I liked. Sticking to array indices throughout makes the
code easier to work with.
Convert dloc/odloc/dseen into a Dwarf struct.

This sets up the infrastructure to easily add fields per
dwarf, such as Adventure II's "toted object" field.

At the same time, retroactively make ODWY0350 more like
ODWY0551: rename dwarf_in() to dwarf_at(), and factor out
kill_a_dwarf().

No functional change.
Refactor describe_object() and spot_treasure().

ODWY0350 and ODWY0551 now follow more of the same structure.
In ODWY0551, I've changed an "if (closed) return" to an
"assert(!closed)", matching ODWY0350's logic. It's not possible
to spot any treasures once the cave has closed (i.e., once you're
in the repository).
Start work on Luckett & Pike's ADV440.
ADV440: FLY, RIDE, and SCORE.
ADV440: implement DROP and READ.
working on adv440