Introduce structure interner, and use for clip interning.
This patch introduces a new data structure, that allows generic structures to be interned. This works similarly to how normal string interning works, however it is specialized to the thread model for WR (explained at the top of intern.rs). The effect of this change is that clip nodes are de-duplicated and persisted between both frames and display lists. This has three primary benefits: * Since they are de-duplicated, the handle for an interned structure uniquely identifies it. This is very useful for future use where we want to be able to quickly and cheaply compare if the contents of a cached picture matches that of a new display list. * Since they are persisted between display lists, the GPU cache handles for the nodes remain valid. This means far fewer GPU cache update patches for types that are interned. * Since they are de-duplicated by content hash value, there are fewer clips overall used by the frame builder. The plan in the future is to extend this to other primitive types, as well as gradient stops, text runs etc. This will allow us to very quickly check if a cached picture remains valid, even in the presence of a completely new display list. This adds a small amount of overhead to the scene builder thread, (extra hashing) but reduces the CPU time in the render backend and compositor threads, which is also a good tradeoff.