(#19447) Puppet::FileSystem::File#stat / lstat

 - All calls to File class stat / lstat go through the new
   FileSystem::File abstraction so that the implementation can later
   be swapped for a Windows specific one to support symlinks
(#19447) Puppet::FileSystem::File.exist?

 - All previous File and FileTest calls to exist? or exists? go through
   the new FileSystem::File abstraction so that the implementation can
   later be swapped for a Windows specific one to support symlinks
(#19447) FileSystem::File#exist? calls self

 - Existing code uses PathName#exist? which is insufficient for
   symlinks on Windows
(#19447) Puppet::FileSystem::File Windows symlink

 - Windows symlink support has been added to exist?, symlink, symlink?,
   readlink, stat, and lstat.  This overrides any usage of Ruby File or
   FileTest classes which are completely borked on Windows.
 - :manages_symlinks feature of the file provider is enabled with the
   existence of the CreateSymbolicLink call in kernel32.dll
 - FFI wrappers for Win32 API calls CreateSymbolicLink, CreateFile,
   GetFileAttributes, DeviceIoControl and CloseHandle added to
   windows/file
   NOTE: The DeviceIoControl method of resolving symlinks was used
   instead of GetFinalPathNameByHandle, which is known to misbehave
   with UNC paths
 - Any tests against :manages_symlinks feature are automatically turned
   on for Windows, increasing test count by approximately 42 new tests
(#19447) Windows symlink check process token

 - Windows symlink support is enabled not only by the existence
   of the CreateSymbolicLink API call, but also by checking the
   current process token for the SeCreateSymbolicLinkPrivilege
 - Inspired by http://stackoverflow.com/a/2129589