Actually use the cache when building Plans

Despite inheriting from base.Cached, we must still implement __init__
and return early when we hit the cache.  Existing tests did not catch
this issue, since we actually return the correct object from the
cache (so plan1 is plan2 for identical arguments), but then go on to
call __init__ anyway.
Add cache_hit counter in Plan

This is so we can see how often we're reusing a Plan object.
Assert that we hit Plan caches correctly
Add explanatory comment in Caching metaclass magic