Improve api caching

Instead of caching each unique dependency API query result, which varies by the combination of gems named in the query, cache the dependency information about each individual gem and dynamically join for each response. This isolates gem dependency information discovery, which is the expensive and slowly-changing part of each query.