Filesystem cache for Repology API responses.
@spec fetch(term(), keyword(), (-> {:ok, term()} | {:error, term()})) :: {:ok, term()} | {:error, term()}
@spec fetch_with_source(term(), keyword(), (-> {:ok, term()} | {:error, term()})) :: {:ok, term(), atom()} | {:error, term()}