(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
(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