std.variant: Implement applyVisitor and applyDelegate.

applyVisitor allows to apply a visitor to the given Algebraic depending
on its held type. It works like boost::apply_visitor of Boost.Variant.
A visitor is specified as a structure
or class which implements opCall overloads for each supported type of the
Algebraic. The function statically ensures that all types are handled by the
visitor.

applyDelegate works like applyVisitor but allows to specfiy the visiting
functions as delegates or static functions. Static checks ensure that
all types are handled and only allowed delegates are passed to the function.
std.variant: applyVisitor had unnecessary template restriction.
std.variant: Updated pull request according to klickverbot's comments.

- Now compiles now on 64bit. size_t -> int cast in unittest has been the problem. Unittests and documentation has been updated.
- Updated template constraints: applyDelegates doesn't need one as the previous constraint is implicitly checked during instation. applyVisitor now has an additional template constraint to just allow Algebraic types.
- Must not compile code in unittests has been replaced by static assert and __trait(compiles) checks.
std.variant: Added more explicit template constraint to applyDelegate which checks for a Algebraic type.

The new constraint isAlgebraic checks for all member functions and types used from  Algebraic and makes it hard to call the applyDelegate with arbitrary types.
New implementation of visit and tryVisit that allows visitor structs and classes as well as delegate functions to be passed as parameters.

tryVisit is a new function which doesn't statically ensures that all types are handled by the visiting
functions. A VariantException is thrown if the algebraic holds a value which isn't handled by
the visitors.

visit and tryVisit share a common private template function as backend which does all the magic. applyDelegate and
applyVisitor have practically been merged into one new function.
Updated visit to allow just delegates passed using the template parameter list.
visit and tryVisit have been extended to allow at most one function with no parameters which is called in case of errors (variant doesn't hold a value or in case of tryVisit, holds a value which can't be handled by visiting functions).
std.variant: Implement applyVisitor and applyDelegate.

applyVisitor allows to apply a visitor to the given Algebraic depending
on its held type. It works like boost::apply_visitor of Boost.Variant.
A visitor is specified as a structure
or class which implements opCall overloads for each supported type of the
Algebraic. The function statically ensures that all types are handled by the
visitor.

applyDelegate works like applyVisitor but allows to specfiy the visiting
functions as delegates or static functions. Static checks ensure that
all types are handled and only allowed delegates are passed to the function.
std.variant: applyVisitor had unnecessary template restriction.
std.variant: Updated pull request according to klickverbot's comments.

- Now compiles now on 64bit. size_t -> int cast in unittest has been the problem. Unittests and documentation has been updated.
- Updated template constraints: applyDelegates doesn't need one as the previous constraint is implicitly checked during instation. applyVisitor now has an additional template constraint to just allow Algebraic types.
- Must not compile code in unittests has been replaced by static assert and __trait(compiles) checks.
std.variant: Added more explicit template constraint to applyDelegate which checks for a Algebraic type.

The new constraint isAlgebraic checks for all member functions and types used from  Algebraic and makes it hard to call the applyDelegate with arbitrary types.
New implementation of visit and tryVisit that allows visitor structs and classes as well as delegate functions to be passed as parameters.

tryVisit is a new function which doesn't statically ensures that all types are handled by the visiting
functions. A VariantException is thrown if the algebraic holds a value which isn't handled by
the visitors.

visit and tryVisit share a common private template function as backend which does all the magic. applyDelegate and
applyVisitor have practically been merged into one new function.
Updated visit to allow just delegates passed using the template parameter list.
visit and tryVisit have been extended to allow at most one function with no parameters which is called in case of errors (variant doesn't hold a value or in case of tryVisit, holds a value which can't be handled by visiting functions).
Merge branch 'master' of github.com:/stonemaster/phobos
Moved filter to the public section.

It seems that Filter accidentally got put in the private section of the
file, and now that the bug making all templates public has been fixed,
Filter isn't useable.
Add check for conversion to float in opArithmetic
fix Issue 8694 - (Un)Compress may cause an InvalidMemoryOperationError

The calls to error() are removed from the finalizers to avoid memory allocations there. The result does not matter at this point anyway since nothing can be done about it.
fix Issue 8702 - tuple(tuple(1)) fails to compile, but tuple(tuple(1),1) works
Missing doc