(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) 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)
(PUP-2881) Refactor IEnumWorkItems for FFI / COM

 - Create IEnumWorkItems interface definition, and rewrite code
   using this interface to safely clean-up memory and call Release on
   the COM interface pointer
 - Rework task name string reading to use FFI pointers safely that
   are the correct width on all platforms
 - Add new FFI::Pointer helper read_com_memory_pointer that will
   automatically call CoTaskMemFree on the pointer
 - To implement this helper, CoTaskMemFree has been copied into the
   api_types code
 - Add new alias to read_win32_long from an FFI::Pointer
(PUP-2881) Setup Taskscheduler HRESULT constants
REWORD (PUP-2881) ITask WIP
(PUP-2881) Remove CoTaskMemFree in windows/com.rb

 - Taskscheduler code now uses only COM pointer helper methods that
   use blocks and free up memory, so this FFI definition is no longer
   required.
REWORD - (PUP-2881) Refactor IPersistFile for FFI / COM

 - Ensure that there is some level of sane exception handling in the
   save method
(PUP-2881) Refactor ITaskTrigger for FFI / COM

 - Define ITaskTrigger COM interface and the relevant struct types using
   FFI
 - Update low-level memory copying and function call definitions to use
   COM wrappers
 - 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
 - Refactored redundant code that tasks a Ruby hash and populates the
   ITaskTrigger object into the populate_trigger method - this is called
   by new_work_item, trigger= and add_trigger
 - Refactor COM struct to Ruby hash conversion code into
   populate_hash_from_trigger
 - Had to extend our TaskScheduler::COM with FFI::Library to gain
   enum definition abilities
(PUP-2881) Remove msvcrt/buffer from taskscheduler

 - Last appendage hanging on from windows-pr