preparing major changes for objects
Merge branch 'dev' into objects
Changed the Object model to use pseudo-inheritance.

Objects now contain a base struct (LuciObject) as their first
struct member, and so can be passed as LuciObjects. Each object
then contains type-specific values after the base object (e.g.

typedef struct {
    LuciObject base;
    long i;
} LuciInt...

This is essentially how Python implements its object-orientation.

I also fixed a bug which occurred when a user specifies to
print a Dot graph, and simultaneously not execute the code. Printing
the Dot graph inherently prevents execution of the code.

Fixed the builtin `range` function to work properly with reverse
ranges.

Added a compile-time link to the system math library (for Linux).
Removed all unnecessary copies and destroys.

Now objects are only copied with a instructions that require it.
Object refcounts are only incremented when "stored" in a symbol,
and decremented when overwritten in a symbol by another object.

These changes have the effect of "leaking" memory for all objects
that allocate memory outside of the garbage collector (e.g. strings
allocate a `char *`, function frames allocate `Frame *`.