Introduce RuleCarrier

The idea behind this patch is to provide developers a very minimal RuleBase interface, so that the interface won't change when modifications being made to the core module.

In addition, a minimal interface allows the maximum amount of flexibility and portability. Rule system could gain more extensible. Custom rules can become more powerful.

There are some code refactorings along the way. For example, RuleSet now is a collection of rules by removing the apply() middle man method; rule configuration values can be fetched directly from RuleConfiguration.

This modification in general makes the OCLint core module more agile.