(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)
fixup with addition of Unknownr
(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