Create class hierarchy for specific issues

A class hierarchy that reflects errors and warnings about analyzed programs is
designed and implemented. It is located in package:

pl.edu.mimuw.nesc.problem.issue

Currently only issues that are related to types resolving are included in this
hierarchy - the code responsible for that process has been changed and its part
that was generating issues messages has been removed. Moreover, a package for
AST utilities is created and appropriate classes are moved to it.
Integrate tags analysis with the issues hierarchy

New error classes are created for errors that may be detected during the tags
analysis. The analysis code is refactored to use these classes to report
errors. Moreover, a bug related to detecting usage of an attribute definition
as a type is fixed.
Adapt the parser to different kinds of literals

AST nodes for integer, character and floating literals are created. The parser
now distinguishes them and makes appropriate nodes that represent them. Integer
literals are analyzed the most before creating nodes - their kinds and suffixes
are determined and stored in nodes in the form of enum values. Numerical values
of the literals are also determined and stored if they don't exceed the maximum
integer value that is allowed. Moreover, tests are created to check the
correctness of analysis of these literals.
Enhance integration of the issues hierarchy

New error and warning classes are created and used. Now almost all errors and
warnings are represented by objects from the issues hierarchy. Syntax errors
and preprocessor warnings are still not present in it.
Refactor codes of issues

Every issue type is now associated with a unique and only instance of Code.
This instance is always returned by 'getCode()' method in the appropriate class.
It allows to uniquely identify an issue that has appeared. Moreover,
'NescIssue' class now carries the code of the issue as an optional value. If an
error or warning is reported using an object of the issues hierarchy, then the
code is stored in the object of a class derived from 'NescIssue'.
Add integration tests

Integration tests are implemented. They consist of good and bad tests. Good
tests are associated with correct programs and the compiler must not report any
errors and warnings for them. In turn, bad tests are associated with programs
with exactly one issue that must be detected by the compiler. Moreover, basic
test programs for the tests are added.