Similarity Caching: Theory and Algorithms