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.
Workaround for bug# 4789 removed.

The "workaround" for bug# 4789 was correct, because it _is_ illegal to
assign overlapping arrays, which assigning a static array to itself
does.
Added overload for canFind which works with multiple needles.
Add std.random.partialShuffle.
Improvements to std.parallelism docs:  Add source link, improve formatting of examples.
Fix for opAssign(T)

This either:
*Asserts if autoInit==No and not initialized (instead of doing an access violation)
*EnsuresInitialized if autoInit==Yes

Uses "move(a, b)" instead of "b = move(a)" for slightly increased performance
Added additional check to isSorted to detect invalid predicates
Fixes in std algorithm

*Tuning of map for "length", "opIndex", "opSlice"
*Fill is more efficient, accepts infinite inpute length
*adjacentFind: Correctly saves
*minCount: Using value types (and not reference types). Throws on empty range
*minPos: Correcttly saves
*equal: More efficient implementation
This test is actually needed

Adds "isSomeString" to map's "length" test.
Fix win32.mak clean target

* this small issue was introduced by commit 1d9c3fa371988a3bb8129294e7b831881a7bf9df
Added Filter and Lambda to std.typetuple.
Merge pull request #729 from andralex/bug8469

Added additional check to isSorted to detect invalid predicates
fix Issue 8508 - std.traits.isSomeString no longer works with enums
fix template constraints
Merge pull request #739 from 9rnsr/fix8508

Issue 8508 - std.traits.isSomeString no longer works with enums
Merge pull request #682 from jmdavis/swap

Workaround for bug# 4789 removed.