(PUP-2693) Fix length calculation for sq-string

The calculation of string length was done wrong for dingle
quoted string resulting in negative lengths.
(PUP-2807) Add output of containing scope for log functions

The log functions in 3x outputs th name of the containing scope
(for notice etc.). The reimplemented methods for the 4x function API
did not include this behavior.

Now, the calling scope is passed to the Logging utility to be output
the same way as for 3x.
(PUP-2891) Treat override of class as an error.

This makes an attempt to override a class parameter issue an
error from the runtime layer rather than expecting the underlying
3x implementation to do it when the left expression does not
result in a resource, or a resource that has 'class' as resource type.
(PUP-2881) Move win32-taskscheduler gem into repo

 - Remove win32-taskscheduler from gemspec through project_data.yaml
 - Update require statements where appropriate
 - All specs verified
(PUP-2881) Bump internal win32-taskscheduler ver
(PUP-2881) Remove taskscheduler's Windows::Process

 - Don't mixin windows-pr code any longer, instead rely on Puppet
   defined constants
(PUP-2881) Remove taskscheduler's Windows::Error

 - Don't mixin windows-pr code for error handling.
 - Rely on Puppet::Util::Windows::Error which is error code aware
 - Update error messages to be standardized, always mention HRESULT
   where applicable
 - Remove unreachable error message code (redundant pITask.nil? check)
(PUP-2881) Remove taskscheduler's Windows::Unicode

 - Use read_arbitrary_wide_string_up_to helper on FFI::Pointer to read
   wide strings from pointers instead of using windows/unicode
 - Use wide_string helper from Puppet::Util::Windows::String instead of
   multi_to_wide helper from windows/unicode
 - Ensure that we don't error trying to read strings from empty pointers
(PUP-2881) Add FFI require to taskscheduler
(PUP-2881) Replace taskscheduler's COM with FFI

 - Remove Windows::COM definitions found in windows-pr from the
   taskscheduler code.
 - FFI calls to CoInitialize, CoUninitialize, CoCreateInstance,
   CoTaskMemFree
 - With calls to CoTaskMemFree made as FFI calls, pass pointer instead
   of it's address
 - Add new HRESULT and LPUNKNOWN definition to api_types
 - NOTE: FFI::MemoryPointer.from_string appends an extra NULL byte to
   the GUID values, allocating 17 bytes instead of 16, which is OK here
   as the underlying API call to CoCreateInstance ignores the stray byte
(PUP-2626) Allow module paths in file()

This modifies the file() function to accept module paths (like the
template() function) as well as fully qualified paths.

This makes it possible for modules that use the file() function
to be more portable, instead of being tied to a specific puppet
server configuration.

Example

with directory structure:

  /etc/puppet/modules/example
  ├── files
  │   └──file.ext
  ├── manifests
  │   └──init.pp
  └── templates
      └──template.erb

When the module path for files can be used instead of the absolute
path:

  file('example/file.ext') returns the same as
  file('/etc/puppet/modules/example/files/file.ext').

This is supposed to be like how template does module paths, where:

  template('example/template.erb') returns the same as
  template('/etc/puppet/modules/example/templates/template.erb')
(PUP-2626) Collapse file finding functions

The file finding function was split up in the same pattern as the
template finding function. This isn't really needed since the logic is
much simpler.
(maint) Update template to follow file methods

The template finding and file finding logic is very similar.
(maint) Clarify and correct method docs.

The method docs were a little bit wrong about what kinds of values will
be returned when. This tries to clean that up a bit and explain how the
methods work.
(PUP-2626) Update file() docs for new selector system

The docs for file() didn't use to say much about how it operated. This
updates the docs so that it makes clear what contents it will return and
how the given filenames are interpreted.
(PUP-2881) Move COM FFI to file windows/com.rb

 - This is the start of a new era, FFI / COM integration.  Run, hide!
 - Start by sliding over FFI function definitions for Win32 COM APIs
   and HRESULT macros.
 - Use a better ComInitialize function that will properly call
   CoUninitialize on application exit.
(PUP-2881) Add Windows COM code from Unknownr

 - Unknownr project at https://github.com/rpeev/Unknownr defines FFI
   bindings around COM interfaces / classes
 - Unknownr is MIT licensed, and only relevant bits have been brought
   into project
 - FFI based wrappers for COM interfaces in the form of 3 new modules
   Interface - for defining COM interfaces by GUID / FFI types
   Factory - for creating a COM object instance by CLSID GUID and
     returning a specified interface type
   Instance - for use when calling QueryInterface on an existing COM
     object to return a class of another type
 - FFI definition for GUID
 - NOTE: Had to add an FFI layout to the Factory class.  The original
   Unknownr code was using a different, older FFI version where this
   might have worked.  In newer code, inheriting from the Interface
   is not enough to pick up the layout in the FFI::Struct that is the
   Interface.
(PUP-2881) Use Windows::Error for COM call fails

 - Update error message / class type to be more consistent with other
   Puppet code
(PUP-2881) Fix Unknownr UseInstance helper

 - Existing code passes an additional unecessary GUID in the call to
   the COM function.
 - Add extra safety check to ensure FFI pointer is not pointing to a
   NULL block of memory
(PUP-2881) Refactor ITaskScheduler for FFI / COM

 - Using the magical COM binding / meta-programming techniques of
   Unknownr, define the ITaskScheduler COM interface as a special
   FFI::Struct derived type.  It uses our local mapping to make calls
   directly to the relevant methods on the interface pointer.
 - Greatly simplify the creation of the ITaskScheduler COM object
 - Properly allocate / cleanup memory with FFI pointer block form
 - No need to manually check HRESULT failure, as the COM wrappers
   will automatically throw exceptions when FAILED HRESULTs encountered
 - Define CLSID_CTask and IID_ITask in terms of the new GUID type
   instead of antiquated Ruby packing techniques
 - Change new_work_item to return the current task (otherwise, it would
   return an invalid FFI::Pointer)
 - With no more calls to CoCreateInstance, mark it as a private member
   of Puppet::Util::Windows::COM