Make async.memoize() preserve async nature of function

As described in #304, `async.memoize()` currently turns asynchronous functions into a synchronous functions if the result is in the cache. This causes program flow to change unexpectedly on subsequent calls.

It should be possible to detect on first run whether the call is synchronous or not and use that to determine the behaviour for the cached case, but that seems like it might belong in a library not called async. Based on that, I made the assumption that the function being wrapped by `async.memoize()` should be assumed to be asynchronous. 

Given that assumption, this PR:
* adds a test for `async.memoize()` to ensure cached results are still asynchronous (commits 1 & 2)
* updates existing tests to not assume synchronous behaviour (commits 3-5)
* finally, updates `async.memoize()` to pass the tests (commit 6)

See also http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony