(#14127) ssh_authorized_keys grammer fails on blank lines.

The `ssh_authorized_keys` grammer, defined for ParsedFile, is wrong about both
comments and blank lines.  Specifically, it failed in two key ways:

It failed if a comment didn't start on character one; any whitespace caused
the comment to be ignored, which is absolutely incorrect by the official
OpenSSH implementation.

It also failed because a "blank" line was defined as a line that contained one
or more whitespace characters at the start - and nothing more!

This failed in a bunch of ways, starting with assuming that a comment on a
line with leading whitespace was actually a blank line.

This change fixes both of those bugs, as well as adding appropriate tests.

(See `rsa_key_allowed_in_file` in `auth-rsa.c` for the parser, at least in the
 current as of this commit version of OpenSSH.  That is official enough for me
 to assume that everyone will behave that way ;)

Signed-off-by: Daniel Pittman <daniel@puppetlabs.com>
maint: refactor integration specs for ssh_authorized_key

Replace all before blocks and instance variables with rspec let methods
and move the stubbing of File.chmod that happened in all tests to the
top to reduce code duplication.
(#14127) Add integration tests for ssh_authorized_key

Test the behaviour of the ssh_authorized key type when modifying a file
with different kind of text lines (inline comment and blank lines)
Properly call indirector when storing file content

Prior to this commit, the static compiler did not specify to use
indirection when finding file content nor when saving a file to the
filebucket.  This commit properly calls the indirection method to
resolve the issue
(#8235) Add plug-in system for tools like Hiera

A new data_binding indirection is being added for interfacing with
tools like Hiera; and provides an "in-dsl" solution for data separation.
Data exposed by tools like Hiera will be made available during parse
time.

For example, if we had the follow class definition:

    class nginx($port=80) { ... }

And it was declared without specifying the `port` attribute:

    class {'nginx': }

The above would result in a data lookup to the data_binding backend for
the following namespaced key:

    nginx::port

Namespaced keys are being used to prevent the pollution of the global
namespace. The convention for namespaced keys is a combination of the
class name and the class parameter being resolved.

Example:

    class ssh::server($port) { ... } # Lookup ssh::server::port

The data_binding backend would need to provide a value for the
namespaced key or return nil. When a nil value is returned by the
data_binding backend the class parameter default, if available, will be
used instead.

It should be noted that class parameters are looked up one at a time
with no assumptions in regards to the performance of data lookups. It's
the responsibility of the data_binding backend to handle any performance
requirements including caching.

This patch also adds two new terminii: hiera and none. The "none"
terminus implements a find method that always returns nil; it's being
set as the default data_binding terminus to allow end-users the ability
to opt-in and maintain backwards compatibility with older versions of
Puppet.

The "hiera" terminus implements a find method that delegates class
parameter lookups to Hiera using the Hiera Ruby API.

Two new configuration settings are being added:

    [main]
      hiera_config = "$confdir/hiera.yaml"
      data_binding_terminus = "none"

Updated specs are included in this patch
Merge pull request #729 from pcarlisle/baduser-windows

Fix for ignoring nonexistent home dirs on Windows
Merge pull request #1 from stschulte/ticket/2.7.x/14127_2

Add extra testing goodness from @stschulte.
Merge pull request #701 from daniel-pittman/bug/2.7.x/14127-ssh-auth-keys-fails-on-completely-empty-line

Bug/2.7.x/14127 ssh auth keys fails on completely empty line
Merge remote-tracking branch 'pcarlisle/repase_config_fix'

* pcarlisle/repase_config_fix:
  Update use of reparse to reparse_config_files
Merge pull request #728 from pcarlisle/maint/2.7.x/post-facts

Fix incorrect argument handling for expire in NodeExpirer
Merge pull request #715 from ccaum/static_compiler_fix

Properly call indirector when storing file content
Merge pull request #718 from kelseyhightower/ticket/master/8235_plugin_system_for_tools_like_hiera

(#8235) Add plug-in system for tools like Hiera
Revert "Fix incorrect argument handling for expire in NodeExpirer"

This reverts commit 1c9bec019e08ce7f53d9fb8c9e7c7b23cc7c8bca. That changeset
was based on a misunderstanding of the code. NodeExpirer#save has an instance
of Puppet::Node::Facts but is calling xpire on Puppet::Node, so it's never
appropriate to pass along the instance.
Merge branch '2.7.x'

* 2.7.x:
  Revert "Fix incorrect argument handling for expire in NodeExpirer"
  Fix #14123 for Windows
  Fix incorrect argument handling for expire in NodeExpirer
  Fix filebucket specs on Windows
  (#8778) Make '' == undef commutative in the DSL
  (#14173) Enforce that filebucket paths must be absolute
  (#14127) Add integration tests for ssh_authorized_key
  maint: refactor integration specs for ssh_authorized_key
  (#14127) ssh_authorized_keys grammer fails on blank lines.
  (#14123) Puppet shouldn't explode if PATH contains ~nonexistent_user

Conflicts:
	lib/puppet/provider/ssh_authorized_key/parsed.rb
	lib/puppet/util.rb
Split out the basic setting behaviors into BaseSetting
Create an exception hierarchy for settings

This moves all settings exceptions into Puppet::Util::Settings and adds
ValidationError and InterpolationError.