Update caching techniques for Dart2JS

This pr does a few things:

* Instead of using timestamps, we use an MD5 hash of the current time.
* `puts` adds a new line to the end of the text already, but a new line was required at the beginning.
* Ensures that folders exist. Quite often, a `Error: FileSystemException: Cannot open file` if the folder didn't exist in the cache.