Store timestamps for modules to autoreload

Closes gh-4127

At present, autoreload compares the timestamps on .py and .pyc files.
However, this can fail in a couple of ways (see gh-4127). With this
change, it caches the mtime of the .py file when we loaded it.

Some extra complexity is needed to store the mtime as soon as possible -
we scan sys.modules when autoreload is loaded, and register a
post_execute hook to check for newly imported modules after each cell.
Use new events system for post_execute callback
Merge pull request #5044 from takluyver/autoreload-nopyc

Store timestamps for modules to autoreload