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.
Added std.range.Sequence slicing (Issue 7896)

See http://d.puremagic.com/issues/show_bug.cgi?id=7896 for more information.
Removed const from Sequence.opSlice()

Also fixed stylistic issues.
Switched from ulong to size_t (failing tests)
Fix bug #8284 by adding const opEquals to std.typecons.Tuple

To fix bug #8284 std.typecons.Tuple needs to have a const opEquals.
Adds also a testcase for std.algorithm using std.typecons.Tuple as
element type for std.container.Array.

This pull request needs a dmd with pull 1075 to fix issue 8522.
Changed take() to takeExactly()

As Sequence is an infinite range, it's guaranteed that there will be more than the number of elements requested, so takeExactly will work just fine, and it has the advantage of having length.
clean indentation and comment
clean indentation in std/algorithm.d
Shortened unittest to use drop() instead of sequential popFront
Added unittest to show relative slicing behaviour more clearly.
Array: Added methods + bugfix

Initially fixes 8332 and 8333

Added some opIndexUnary to both Array and Array.Range
Gave Array.Range opSliceUnary and opSliceOpAssign to do "range wide operation" aka:
r+=5 or ++r

Also moved a _few_ methods around for logical grouping. Bit of comment editing for consistency.
Updated visit to allow just delegates passed using the template parameter list.
Corrections
Fix filter doc typos
Show function signatures for eponymous templates in std.algorithm docs
Changed static slicing to relative slicing.