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