(#19447) Add :manages_symlinks to file type

 - The ensure => :link feature of the file type is now restricted by
   the :manages_symlinks feature
 - Only the existing POSIX provider allows symlink support
 - Updated relevant tests to check a provider for
   .feature?(:manages_symlinks) over Puppet.features.microsoft_windows?
 - metadata_spec.rb was refactored as RSpec nested tests can override
   their ability to run with true :if conditions. Shared examples
   intended to be run on Windows only were also being executed under
   OSX because provider feature :manages_symlinks check was true,
   despite the enclosing test scope being restricted to Windows
 - file_spec.rb unit tests had 5 new manages_symlinks guards enabled on
   tests, preventing 10 existing tests from running on Windows that
   likely should never have been run in that environment (these tests
   will be re-enabled with Windows symlink support)
(#19447) Puppet::FileSystem::File#symlink(?)

 - All calls to File / FileTest class methods symlink and symlink? go
   through instance methods on 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#readlink

 - All calls to File readlink 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#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