Add a single entry gate for dispose

This ensures we only call dispose once and that anything other method
throws an ObjectDisposedMethod when the cache is disposed.