Cache the AST generated by the Parser

Since we are generating the full AST for each parse request, we end
up compiling the same source code multiple times for different files.
This is especially true when starting MonoDevelop.

By caching the AST, we only need to invoke the compiler when a file
has actually changed.  If nothing has changed, just return the module
for a given file that was generated the last time it was invoked.

There are some trace statements included so we can tell what was a
cache hit and what was a cache miss.