Some sources like string can be accessed much faster (up to several
tens times faster) then objects where access operations are written on
Python, so it is better to use 'em directly.
Also cache_clear() and stat are fixed to avoid looping in cycles

On calling some_rule.parse(src) memoization cache is cleared because
data is ordinary taken from new source. During the parsing .match() is
used and saved matches are returned if exist. So, user should call
some_rule.parse(src) for any new source (normal use cases) and can
call some_rule.match(src) if need to parse the same source as before

Rule generator can just return another rule with different action,
original rule was modified before causing unexpected behaviour. Now
copy properties are added into rules to use in described cases etc.