Fix some issues with symbol names. This was horribly busted.

In short, we store signatures with and without return values, with and
without templates, and with varying degrees of namespace and class
qualifications.

We always store argument lists for functions but we automagically
generate symbol names with the arguments stripped.

We also store magical parameter and function locals like so:

void foobar(int foo, int bar)
{
    int tmp = foo + bar;
}

void foobar(int, int)::foo
int foo
void foobar(int, int)::bar
int bar
void foobar(int, int)::tmp
int tmp