For a while now, some uproot functions have been accepting a dictionary-like object as a cache, so if branches are in the supplied dictionary, they will not be extracted again from the ROOT file.
This version adds MemoryCache, ThreadSafeMemoryCache, and DiskCache (which is persistent and process-safe) as dictionary-like objects that can be used as caches. They all track memory usage (`numbytes` attribute) and evict the least-recently used items when it exceeds a threshold (`limitbytes`).
This code was mostly ported from the old PLUR project, adding process-safety to DiskCache so that a collection of servlets supervised by WSGI can share the same SSD cache (for example).