Add recursion override

The subclass overriding one of the recursion method is not as reliable
as the parent Async class is always instantiated when the task is
deserialized. This way we can propagate the intention to disable
recursion through the Async options that gets passed around and we can
see how deep a specific recursion chain has gone on. This is potentially
useful for debugging.

The specific implementation is if you explicitly set max depth to -1
then it will ignore the depth check.