Allow caching of scores computations
This commit introduces a cache for get_scores. Currently most of the time of a request is spent in this function (300ms). To save some latency, we instead store the scores on disk and load them when computing the leaderboard.
Cache coherency is managed by two mechanisms:
- The cache automatically expires after one minute, keeping possible mistakes short-lived.
- When adding new EventPlayerResults, the cache is invalidated.