Preferring prototyp_compare() to take lists
Reorganizing and adding comments
Major refactor of parameter and declaration handling

Lots of DRY applied. More use of if/else over switch, and rule over
size. Documentation added. Checks if function was previously defined.
Adding print_typeinfo function

- Refactoring and fixing print_basetype function
- Fixing get_type() for classes
Getting full function return type for function definitions
Much better typeinfo printing
Major refactor of information gathering and typeinfo creation

Added a generic tree traversal to find the first token (in a pre-order
search) with the given target category, or the 'before' category if
encountered first.

Added helpers for getting identifier, pointer, array, class info using
this traversal.

Programmatically this is much cleaner and easier to understand, and
should also handle different tree shapes for rules a bit
better. However, this is a computationally most costly algorithm, since
each piece of info requires a recursive search on that subtree, rather
than just grabbing the information. But programmer time and maintenance
win over CPU cycles.

The typeinfo_new() now just allocates the struct, and pieces of
information are added on as they're found, rather than attempting to
find it all and send it to a variadic "constructor" function which was
way more headache than it was worth.

Note that standard libraries are currently no longer implemented, as
they require some refactoring due to the removal of the constructor.
Removing 2D array from test.cpp (not in requirements)
Updating tasks