Improved C++ symbol indexing support.

It's still not perfect, but it handles most code quite well.

The main case I'm aware of that this doesn't handle is a templated struct/class/union with a templated default type, e.g.:

    template <class A = some_type<int>>
    class Foo {
        ...
    }

The nested <> aren't handled properly.  But regex isn't really suited to handling matched nested pairs, so this seems reasonable to not handle for now.