(PUP-2906) Reimplement collection evaluation

Since collection currently relies on the 3x AST, it must be
reimplemented in such a way that it does not rely on the old parser.
That way, we won't break collection with the old parser is removed
for the 4x series.

Take the first steps towards doing this by reimplementing evaluation
for collections so that it no longer relies on
Puppet::Parser::AST::Collection or Puppet::Parser::AST::CollExpr.

Additionally, make a small change to resource/file/content.rb so
that it uses dup instead of clone. This is necessary to prevent
trying to modify a frozen String.
(PUP-2906) Refactor collector into several classes

Prior to this commit, the parser created a Puppet::Parser::Collector
in order to collect resources. However, there were three distinct
code paths that needed to be dealt with: collection of virtual
resources, collection of exported resources, and realization of
a set of resources.

In order to make the code for collection more readable and manageable,
split up the current collector into three different collectors which
reflect the code paths described above.

Additionally, make some changes to the compiler so that it is compatible
with these new collectors while still supporting the old 3x collector.
(PUP-2906) Add benchmark for collection

In order to ensure that we don't make collection any slower, add
a benchmark which tests how long it takes to create 200 resources
and collect them.
(PUP-2906) Optimize and clean up code

Use the benchmark to track down and fix some code that could be
optimized to make collection faster. Additionally clean up the
code for collectors and add some YARD documentation for the API.
(PUP-2906) Add test for nonexistent resources

To ensure that the fail method is called properly in the
CollectorTransformer's evaluate method, add a test with a manifest
containing a resource type that does not exist.

Additionally do a few small code and comment cleanups.
Merge pull request #3290 from hkenney/issue/stable/pup-2906_implement_collection_without_3x_ast

(PUP-2906) Reimplement Collection without 3x AST