(maint) Remove unused constructs and use faster polymorph calls

This removes the ability to pass a block to evaluate since this
was only used in one specific case, and there are many calls to
evaluate (removes one conditional in very hot execution path).

Adds caching to polymorph tables in compare operator
sub evaluator.
(maint) Remove support for hyphen in name in lexer2
(#22363) Add support for evaluation of CollectExpression.

This replaces the earlier attempt of improving the CollectExpression
evaluation with an extended set of operations. The 3x API proved to
be too complicated. Instead, the implementation now performs a
transformation to the 3x way of handling Collection and evaluates
the transformed logic.
(#22363) Make selector and case use same equality as for '==' operator

The is_match? used by selector and case used Ruby == for all
RHS matches except for regular expression. This is now changed to
use the Puppet '==' operator.

Also, in this commit is a change that checks that LHS result is
a String when the RHS is a regular expression - an issue is
raised otherwise (other than the earlier Ruby TypeError).

Tests added.
(#22363) Remove unused datatype_reference method in evaluator.

This method was unused - its intent was to create an RGen meta type
given a name - creation of types is deferred to a future version and
this method was just dead weight.
(maint) Remove stale TODO comments
(#22363) Remove the support for applying [] operation without arg(s).

The intent was to use an empty [] as a "default", but this was
a bad idea, it is just as easy (and clearer) to write just Array instead
of Array[] to mean an unspecified Array. All variants of apply of
[] to LHS now raise an error if arguments are empty.
(#22363) Refactor name of Puppet::Pops::Evaluator::Lambda to Closure

The new implementation is a Closure in that it has a reference to
the Evaluator and Scope where it was created.
(maint) Cleanup unused code and fix comments

There is no need to have an Evaluator class that describes the
API of an Evaluator at this point (since it is not used it had drifted
from the real implementation anyway).
(maint) Delete reference grammar.ra

The file pops/parser/grammar.ra was an intermediate step between
the old and the new grammar implementation. It used the old grammar
but created the new model. It can now be removed as the new grammar
is functioning as expected. (The original grammar is still available
as an up to date reference. The copy in pops/parser was not maintained).
(maint) Add TODO comment about \u handling in string quoting
(#22363) Improve handling of PNilType

Without this an inference of nil / undef results in an error. Now
the String 'Undef' is used.

Also, without this, a check for assignability to Nil would result
in assignability to PObjectType (which is the widest type), and this
would be wrong. (This is quite esoteric, but added for correctness).

To prevent the type reference Undef to be interpreted as a Resource
type, it has also been added to the type parser. And as a consequence
also to the type factory.
(#22363) Add missing support for Numeric type

The TypeParser and TypeFactory did not have support for the
abstract Numeric type.
(#22363) Correct failing test that relied on fixed bug for Type[Undef]

When the missing string conversion of Undef was added, the faulty test
triggered. It is now correct to check that the result is Type[Undef]
instead of Type[Object].
(#22363) Make interpolation use string_ for all runtime types

This adds polymorph string_ methods for Array, Hash, and Regexp to
ensure that interpolation result is defined (as opposed to just using
to_s and then being surprised when regexps and types come out weird.

Tests added.
(#22363) Add test for interpolation string conversion undef / default

There was no test for evaluation result of undef or default being
interpolated.
(#22363) Add more String interpolation tests
(#22363) Remove ablity to apply operator % to floats

The result is almost always surprising when trying modulo operator
on floats. It only works in a meaningful way if the floating point
numbers are integral in the first place. Rounding errors makes results
very confusing. An error is now issued instead that % is not applicable
to floats.
(#22363) Add test that shows negaice shift reverses direction

When shifting a negative count the direction of the shift is changed.
This adds tests that shows this.
(#22363) Add test that false != ''

A falsey value is not equal to false.