Cache analysis files by fingerprint.

Replaces the previous cache by file path. That one was fragile in the presence of changes to the underlying files, and didn't allow cache hits for the same analysis in a renamed file.