(#18942) Add XOR operator

Adds support for the xor boolean operator.
Merge branch 'dalen-xor_operator' closes #1436

* dalen-xor_operator:
  (#18942) Add XOR operator
Revert "Merge branch 'dalen-xor_operator' closes #1436"

This reverts commit 285bc8c85b5e667d7293e640547aac3bbde75c15, reversing
changes made to 47771e2892182fe78c34c55c5d433f16d6bb34d1.

This patch is being reverted due to the following concerns raised on the
pull request comment stream:

XOR is also done with the same precedence as OR - this is has some
effects:

    true or false xor true == false
    false xor true or false == true

Was this intentional? I think this is going to make people confused, as
opposed to setting the precedence of XOR to be lower (or higher) than OR
to have a clear order of evaluation.

Also, "Hate to be picky, but this is not 100% backwards compatible. If
someone used a bare word xor in their manifests this would now not work,
if someone has written an xor function it is now not callable. If I
remember correctly using keyword as name is not supported for every
construct."
Make envpuppet run under sh
Revert "Revert "Merge branch 'stschulte-ticket/master/fixup_expiry'""

This reverts commit 1ddcb5e511e131645cfa89305784f66427374287.

Conflicts:
    spec/unit/provider/user/useradd_spec.rb

The original commit "Merge branch
'stschulte-ticket/master/fixup_expiry'" was reverted because it caused
failures on ruby 1.8 because Date.next_day and Date.prev_day are not
public in ruby 1.8 (will the methods are publicly available in ruby 1.9)

Revert the revert and reinstall the original commit to be able to fix
the issues.
Fix user expiry failures on ruby 1.8

Date.next_day is private on ruby 1.8 while it is public on ruby 1.9

Convert the expiry to a date in a different way that works both on ruby
1.8.7 and ruby 1.9
Fix user expiry on Solaris

The useradd provider can manage the expiry of a user account. To remove
an expiry you can use `usermod -e '' alice` and on Solaris the man page
states that providing `' '` would cause usermod to remove the expiry.
This happens to be not true at least on Solaris 10 so treat Linux and
Solaris the same.

However setting the expiry date to a real date is different on Solaris.
While Linux only accepts the date in the format YYYY-MM-DD, Solaris
accepts multiple different formats but %Y-%m-%d is not one of them. So
use the format %m/%d%/%Y when on Solaris which is also used in the useradd
manpage (and did work on test box)
Merge branch 'stschulte-ticket/master/user_expiry_solaris'd closes #1424

* stschulte-ticket/master/user_expiry_solaris:
  Fix user expiry on Solaris
  Fix user expiry failures on ruby 1.8
  Revert "Revert "Merge branch 'stschulte-ticket/master/fixup_expiry'""