Mappings: Make lookup structures immutable.

This commit makes the lookup structures that are used for mappings immutable.
When changes are required, a new instance is created while the current instance
is left unmodified. This is done efficiently thanks to a hash table
implementation based on a array hash trie, see
org.elasticsearch.common.collect.CopyOnWriteHashMap.

ManyMappingsBenchmark returns indexing times that are similar to the ones that
can be observed in current master.

Ultimately, I would like to see if we can make mappings completely immutable as
well and updated atomically. This is not trivial however, eg. because of dynamic
mappings. So here is a first baby step that should help move towards that
direction.
Maybe call this `copyWithDefaultAnalyzer` or something?  set implies it is mutating the existing object.  But is this really  needed at all?  If I have a `FieldNameAnalyzer` named `f`, then I can do:
`new FieldNameAnalyzer(f.analyzers(), defaultAnalyzer)`.  This method seems to just mask what is actually happening (creating a new FieldNameAnalyzer).