add a completely backwards compatible way to use async.apply with a context via call

Basically, what this does is make it so that, in async.apply, if the value of "this" is anything but async (which would only happen if you specified a thisArg via something like call or apply), it passes that as the thisArg to fn.apply instead of undefined.

See the test cases I've added (shamelessly ripped out of https://github.com/caolan/async/pull/81) for usage.