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.
Performance improvements for popFront and narrow strings.
Attribute inferrence should solve the @safe problem for benchmark now.
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.
Make Cycle const-correct.

I also had to make the dummy range stuff const-correct (since it's used
to test Cycle). I cleaned up Cycle's documentation as well.
Runnable examples - std.array
Remove the move notice table in std.string.
Deprecated std.file.listDir.
Runnable examples - std.base64
runnable examples - std.concurrency
Merge pull request #695 from jmdavis/file

Deprecated std.file.listDir.
Updated changelog for listDir deprecation.
Merge pull request #693 from alexrp/std-string-table

Remove the move notice table in std.string.
Merge pull request #692 from nazriel/runnable-examples

Runnable examples - std.array, std.base64, std.concurreny
Merge pull request #670 from jmdavis/benchmark

Attribute inferrence should solve the @safe problem for benchmark now.
Adding myself as author to the modules I have contributed to.

This is just me committing to maintain my code additions to
these modules. We should, in general, use these author lists
more so we know who's responsible for the various modules.