Enrich the types classes with integer promotions

Integer promotions are now implemented. 'promote' method that makes the
promotion has been added to 'Type' interface and implemented in subclasses.
Add the possibility of checking if a type is real

'isRealType' method is added to 'Type' interface and implemented. This allows
checking if a type is real.
Add retrieving corresponding integer types

A signed integer type has now a method that allows retrieving the corresponding
unsigned integer type. And vice versa.
Implement usual arithmetic conversions

A static method in a new class 'TypeUtils' that performs the usual arithmetic
conversions is added. Moreover, types classes are enriched with default
constructors that initialize types as unqualified and with methods for removing
qualifiers and testing compatibility with other types.
Enhance types class hierarchy

Now it can be checked if a type is complete at a particular position of
a program. This can be achieved using 'isComplete' method from 'Type'
interface. Moreover, it can be checked if a type is an object or a function
type.
Add checking the validity of types

It is checked if types that are specified in programs are valid. Currently, the
array and function types are tested.
Enhance the analysis of tags

The structure of fields of a field tag type is now built and stored in the
symbol table. It is useful if a tag contains an unnamed member of an anonymous
tag type. Moreover, types of fields of field tag types are checked for
validity and detected errors are reported.
Analyze tags definitions in two phases

The analysis of tags definitions is split to two phases: when the start of
a tag definition is detected and parsed (before any fields) and after all
fields and attributes are fully parsed. Moreover, some small improvements of
the code are introduced.