(PUP-2860) Separate models into meta and impl

This separates the three models for the language, types and
bindings into separate files for the meta part and the implementation.
This is done in anticipation of future changes / alternative ways of
generating the logic and working with models.

Now, when the runtime model is wanted, it loads the meta part and
then mixes in the implementation.

This also separates the dependencies between the models; now the
PopsObject from the language model is not reused in the other models.
(perf) Change benchmark:empty_catalog to include measure of startup

The intent of this benchmark is to provide measures for optimizing the
puppet apply case, not including the startup time skewes the result in
favor of the current parser/evaluator as it is loaded as part of
startup, and "pops" is loaded lazily when a compilation takes place.
(perf) Avoid extracting resource type/title multiple times.

This avoids a large number of calls to extract the type and title
from a resource ref.
(perf) Make micro improvment by avoiding a method call for getting line
(perf) Make micro improvement in getting exported/virtual status
(PUP-2860) Make micro improvement by removing redundant checks

This removes redundant checks for exported? and virtual? by calling
the underlying exported and virtual methods. There was no real reason
why it needed to check if methods exists before calling them.
(PUP-2860) Make injector transform using faster visitor call
(PUP-2860) Remove repeated assert_rgen from other sources.

The assert_rgen_installed() method is called from multiple sources,
and it did not check if an assert had already been made. This logic
was in the methods that called assert_rgen_installed().

This change moves the check if already asserted into the method
itself. This reduces the number of calls to require rgen, and the number
of rgen version compliance checks to 1.
(perf) Make a series of small nips and tucks wrt performance

This makes a series of small changes in the evaluator logic.
replacing use of literal strings with frozen constants, choosing
a faster way to produce a string, to do a join etc.

Some of the optimizations also produce less garbage, but this is very
difficult to measure. Do not expect better micro benchmark results from
these changes.
(maint) Remove the unused class Visitor::Visitor2

The Visitor2 class had an alternative method for making
polymorphic dispatch based on fact that calling a bound method
is faster than a send. The gain is however lost since bound methods
are instance specific and it is thus not possible to cache across
all instances. Using the Visitor2 also requires one extra step of setup.

Now that we have benchmarks, there was no improvement when using
Visitor2 over the regular Visitor, in fact there was a tendency for
Visitor2 to be slower (by ~1% in a couple of the runs).

This was expected, as polymorphic dispatching did not show up on the hot
list.
(perf) Make small perf adjustments to TypeFactory

It is faster to compare :symbol == x than the other way around when the
x can be something other than a symbol (nil, string, integer) etc.
(perf) Make small adjustments to TypeCalculator

Most of the changes are to call assignable_PIntegerType directly
when it is known that both sides are PIntegerType instead of calling
the polymorphic dispatch.
(PUP-2860) Remove future parser's old lexer

The old (intermediate) lexer was still hanging around even if it was
not being used. Cycles were also wasted on unit testing it.

The new lexer "Lexer2" has been in use for quite some time and the
old lexer is not useful even as a reference at this point.

This speeds up both loading and unit testing.
(perf) freeze all string tokens at the source (in the lexer)

This freezes all strings that are returned as tokens (varname,
sq and dq string, name, classref). Keywords were already frozen.

This optimizations means that these strings does not have to be frozen
later, and the values are faster to use as hash lookup without incurring
the penalty of again freezing (~10us per freeze call).

+ it is a sane thing to do anyway to avoid someone modifying the
strings.
(maint) Remove extra abstraction PAbstractType - change to PAnyType

Since all types now are PAnyType, there is no need to have
an extra abstratin called PAbstractType, it just adds level in
the ancestor hierarchy that needs to be consulted for methods, one
extra step to go when checking is_a? against PAbstractType instead of
PAnyType, etc.
(perf) Use faster polymorph lookup in bindings checker
(maint) Fix run of "empty catalog" benchmark missing current_environment

The "empty catalog" benchmark is suppose to do the first half of
what "puppet apply" does, but it did not include setting up the current
environemt thus causing part of the run to use the *root* environment.
(The apply applications sets current_environment).
(PUP-2860) Fix comments as pointed out in review

Fix files with same comment after splitting models. The implementation
now points out that it uses the meta part and mixes in the
implementation.

The possible optimization logged in a ticket, and ticket is instead
referenced in the comments.

Manual inlining of accessor commented to avoid it being DRYed out.
(maint) Fix regression - negative string length came back after merge.

This was a manual merge mistake.
(perf) Make small optimization to lexer by avoiding extra array

This removes the extra array being created for every token returned
from the lexer - the token is already an array with the correct
content.