(PUP-2738) FFI::Pointer#read_win32_local_pointer

 - Create new block style helper that automatically calls LocalFree on
   a returned pointer after it's done being used. Since the ptr is no
   longer valid after the block yields, return nil from the method
 - Move FFI definition for LocalFree into FFI::WIN32 and out of
   Puppet::Util::Windows::Error and Puppet::Util::Windows::SID
 - Ensure that proper wide string is resolved / passed out of
   Puppet::Util::Windows::Error.format_error_code and
   Puppet::Util::Windows::SID.sid_ptr_to_string when resolving string
   inside of a block
 - Refactor Puppet::Util::Windows::SID.valid_sid? to read ptr inside
   block, use closure to store the 'valid' return value
(PUP-2738) FFI from_string_to_wide_string block

 - MemoryPointer from_string_to_wide_string previously allocated a
   new MemoryPointer instance but didn't force callers to scope / free
   it.  This allowed the Ruby runtime to clean it up on GC, but we
   prefer to force callers to use a block form, to clean up the
   unmanaged memory when the variable is no longer needed.  Refactor
   the method to yield the ptr.
 - Since the ptr is no longer valid after the block yields, return nil
   from the method
(PUP-2738) Puppet::Util::Windows::User refactor

  - Presently `logon_user` raises an exception or returns the error code
    returned by `CloseHandle`.  Change this to return `true` if the
    method executes without error.
  - This also affects the `load_profile` method and the `password_is?`
    method.  `load_profile` previously returned the `logon_user` return
    value from the outer block, so now returns `true` upon success, or
    will raise an error upon failure
(PUP-2738) open_symlink should wide_string once

 - open_symlink is the only caller for create_file, and create_file
   already calls wide_string on the first parameter.  Remove
   unnecessary wide_string call perfomed in open_symlink
(PUP-2738) Puppet::Util::Windows::File FFI cleanup

 - Break resolve_symlink into an additional helper to simplify memory
   usage / cleanup.  Each time an FFI::MemoryPointer is encountered,
   it's cleaned up immediately after use. Structure code to ensure that
   a REPARSE_DATA_BUFFER is returned from resolve_symlink rather than
   a FFI::MemoryPointer
 - Ensure that Puppet::Util::Windows::File.resolve_symlink return value
   is given default, and closed on inside block to prevent incorrect
   return value.
(PUP-2738) Puppet::Util::Windows::Process FFI clean

 - Refactor wait_process so that the FFI::MemoryPointer for the exit
   code is cleaned up immediately after use.  Note that we capture the
   exit_status within the block, and return it outside of the block
 - Fix bug in Puppet::Util::Windows::Process.process_privilege_symlink?
   that could result in the wrong value being returned.
 - Fix bug in Puppet::Util::Windows::Process.elevated_security?
   that could result in the wrong value being returned.
(PUP-2738) Use block form of FFI::MemoryPointer

 - Existing uses of FFI::MemoryPointer rely on Ruby GC to perform
   non-deterministic memory cleanup.  In an effort to reduce memory
   consumption, use the block form of FFI::MemoryPointer to call free
   on pointers as soon as they're no longer needed.
 - Ensure that we don't use non-local return's anywhere, due to their
   potential dangerous / unexpected behavior.  When inside blocks,
   store off return values in a separate variable to be returned
   outside the block.  When values are only used inside yields, and the
   corresponding unmanaged memory has been freed, return nil outside
   the block.
(PUP-2738) Windows utils appropriate return values

 - Puppet::Util::Windows::File.open_symlink was previously returning
   the integer result of CloseHandle, which was undesireable.  Assume
   the token is always used in a block, so return nil from the method.
 - Puppet::Util::Windows::File.readlink was being a bit dangerous, and
   performing a non-local return within a block.  Use a closure instead
   to capture the return value of resolve_symlink, return outside block.
 - Puppet::Util::Windows::Process.open_procss_token had the same issue
   as open_symlink, and has been changed to return nil.
(PUP-2738) Move CloseHandle -> FFI::WIN32

  - CloseHandle is an API used frequently, so move it to a shared
    definition inside FFI::WIN32.  Remove extraneous definitions and
    update call sites.
(PUP-2738) Windows::File use FFI::Pointer helper

 - Remove custom packing of array bytes and replace with use of
   read_wide_string from FFI::Pointer
Merge branch 'ticket/master/PUP-2738-FFI-Memory-Issues'

* ticket/master/PUP-2738-FFI-Memory-Issues:
  (PUP-2738) Windows::File use FFI::Pointer helper
  (PUP-2738) Move CloseHandle -> FFI::WIN32
  (PUP-2738) Windows utils appropriate return values
  (PUP-2738) Use block form of FFI::MemoryPointer
  (PUP-2738) Puppet::Util::Windows::Process FFI clean
  (PUP-2738) Puppet::Util::Windows::File FFI cleanup
  (PUP-2738) open_symlink should wide_string once
  (PUP-2738) Puppet::Util::Windows::User refactor
  (PUP-2738) FFI from_string_to_wide_string block
  (PUP-2738) FFI::Pointer#read_win32_local_pointer