Add analysis of attributes definitions

Information about user-defined attributes is now stored in the symbol table. It
contains the list of fields from the definition. Moreover, usage of such
definitions as type specifiers is reported as an error.
Fix the exception thrown for some pointer declarators

The exception thrown for pointer declarators with attributes does not appear
and such declarators are correctly handled.
Add resolving types of all objects

Types of all objects are resolved and saved to the symbol table. Classes of
objects that carry information in the symbol table are enriched to be able to
store the type.
Add handling of type definitions during type resolving

Type definitions are now supported while resolving types of objects. However,
references to type definitions from other components are not.
Adapt the types analysis to optional declarators

Declarators wrapped in Optional are now properly handled while resolving a base
type.
Handle more classes in visitors
Correct resolving types of generic parameters

Only types of parameters of generic components that are not type parameters are
resolved and an invalid error is not reported.