(maint) Pull apart test for reuse

The cache expiration service test had some useful parts in it that will
be useful for another test later. This pulls it apart so that those
pieces are available and also is a little refactoring so that I can
become familiar with how it was working.
(PUP-3635) Add scanf function

This adds a scanf function that is useful when converting from a string
to other data types.
(maint) Unify many directory structures for test

The previous tests used a lot of different structures and set them up
individually. This was nice in that each test was self contained, but it
also left a lot of noise in some tests that only cared that *any*
environment simply exists, and the exact form of the environments wasn't
important. This unifies all of those cases so that there is a reusable
"basic" environment available.
(PUP-3621) Ensure that get! caches

The introduction of get! caused any users of that method to circumvent
the cache. This happened because, rather than delegating to get() and
raising an error, it implemented similar logic to get(), but only from
the common base class. This caused it to skip all caching checks. This
adds caching back in and adds tests for that behavior.
(maint) Remove inheritance to make mistakes less likely

The previous mistake happened partly because the classes were written
with inheritance rather than delegation. The inheritance caused the
Combined#get! implementation to be used, which was appropriate for it,
but not for the Cached get. The Cached implementation also has no reason
to allow multiple loaders, instead it only needs a single loader and
multiple ones can be put together using the Combined loader. This change
makes that distinction much clearer.
(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
Merge pull request #3291 from zaphod42/issue/stable/pup-3621-lost-env-caches

(PUP-3621) Ensure that get! caches
(PUP-3615) Remove string to number auto convert for compare and equals

This removes the problematic auto convert from String to Number for
comparisson operations.
(PUP-3615) Change test to query using string mode instead of integers

There was one test, that after the change to using the new 4x Collectors
failed when the string to numeric conversion no longer is done.

The test queried for "mode == 0677" which is wrong since mode is a
String. This commit corrects the test to use "mode == '0677'"
Merge pull request #3293 from hlindberg/PUP-3615_remove-string-to-number-auto-convert

(PUP-3615) Remove string to number auto convert for compare and equals
Merge pull request #3287 from hlindberg/PUP-3635_add-scanf-function

(PUP-3635) Add scanf function
(PUP-3621) Add search_paths and list to Cached environment loader

Recent changes to the Puppet::Environments::Cached loader changed its
construction so that it was no longer a subclass of Combined. This
meant that it no longer had search_path or list functions, which are
needed by the v2 environments to list known directory environments. We
were lacking spec coverage for this and it was caught by the
can_enumerate_environments system test.

In this commit, the Cached loader now delegates search_paths and list
calls to its @loader. Specs have been added for search_paths/list calls,
for the Combined loader in general, and for get_conf in Cached.
Accessors were added to EnvironmentConf for some of its internal
attributes so that it can more easily be tested.
Merge pull request #3300 from jpartlow/issue/stable/pup-3621-cached-environment-search-paths-and-list

(PUP-3621) Add search_paths and list to Cached environment loader
Merge branch 'stable'