[STORE] Expose ShardId via LeafReader rather than Direcotry API

Today we try to fetch a shard Id for a given IndexReader / LeafReader
by walking it's tree until the lucene internal SegmentReader and then
casting the directory into a StoreDirecotory. This class is fully internal
to Elasticsearch and should not be exposed outside of the Store.

This commit makes StoreDirectory a private inner class and adds dedicated
ElasticsearchDirectoryReader / ElasticserachLeafReader exposing a ShardId
getter to obtain information about the shard the index / segment belogs to.

These classes can be used to expose other segment specific information in
the future more easily.
I think this needs to override getCoreCacheKey() & co, or things are not really working per-segment :)

From javadocs:
NOTE: If this FilterLeafReader does not change the content the contained reader, you could consider overriding
getCoreCacheKey() so that CachingWrapperFilter shares the same entries for this atomic reader
and the wrapped one. getCombinedCoreAndDeletesKey() could be overridden as well if the live docs are not changed either.