!.[]* in type names

these changes fixes the following cases:

protected:
    int[] foo;


protected:
    int* foo;

protected:
    FOO.BAR foo;

it also fixes a bug that causes struct/class keywords (when the type has type arguments) being incorrectly fontified in type face.

eg. struct Vec(T, alias N)