(maint) Remove GC bug workaround for Ruby < 1.8.7

Commit bd5dc649 added a workaround for a Ruby GC bug that was present in
1.8.5, 1.8.6, and partially fixed but still residual in 1.8.7. Since
we're dropping Ruby 1.8 support entirely we can now remove the
workarounds.
(PUP-3312) Remove deprecated methods from the Puppet module

This commit removes the `parse_config` and
`initialize_settings_for_run_mode` class methods from the Puppet
module. This commit is part of the code removal effort for Puppet 4.
(PUP-3569) Do not require rubygems in Rakefile for modules
(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-2733) Refactor binder's use of Puppetx

This refactors the binder's use of Puppetx. The problem with the
previous implementation was that it squatted on the Puppetx namespace in
a way that made it difficult to use for its original purpose.

This commit changes the organization. The extension points that define
how puppet can be extended are in Puppet:Spi namespaced modules. One
module per extension. Each such extension specifies the type and the
symbols to use when binding services.

A Puppet::Spi::Configuration is responsible for configuring/wiring
the service programming interface(s) by registering them for inclusion
in the binder(s) being set up.

The only currently existing implementation of a default service is
the Json syntax checker - it has also moved out from the Puppetx
namespace and is now found in Puppet::SyntaxCheckers::Json.
(PUP-2733) Rename puppet::spi to puppet::plugins
(PUP-2733) Cleanup names that contained SPI and touch up comments
(PUP-3635) Add scanf function

This adds a scanf function that is useful when converting from a string
to other data types.
(PUP-3293) Remove deprecated and unused pson and rubygems features

This commit removes the deprecated `features.pson?` and `features.rubygems?`
features.
(maint) remove reference to ext/puppet-load.rb

In commit a8be1158d, the file `ext/puppet-load.rb` was deleted.
However, its reference for our packaging systems in
`ext/redhat/puppet.spec.rb`, causing our packaging on EL to fail.

This commit removes the reference in ext/redhat/puppet.spec.erb.
(PUP-3568) Use puppet-lint v1 in module skeleton

The relative bit is necessary with puppet-lint v1 or it will fail if the
directory is not named correctly, which anyone doing development is
going to have. After I upgraded to puppet-lint v1, all of my travis-ci
builds started to fail and this is the fix.

These are all common situations that would fail

* Using Travis-ci.org

* `puppet module generate ghoneycutt-foo && cd ghoneycutt-foo && \
  rake lint`

* `git clone https://github.com/ghoneycutt/puppet-module-dnsclient.git \
  && cd puppet-module-dnsclient && rake lint`
(maint) fix filename for acceptance sshkey

The boostrap script `acceptance/bin/ci-bootstrap-from-artifacts.sh` uses
an outdated filename/SSH key for our acceptance runs. We've been
(temporarily) hacking around this by sed'ing this file in our Jenkins
jobs. This commit fixes the filename in the script itself.
Merge pull request #3289 from rji/maint/stable/acceptance-sshkey

(maint) fix filename for acceptance sshkey
(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.
Merge remote-tracking branch 'upstream/stable'

* upstream/stable:
  (maint) fix filename for acceptance sshkey
(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.