• 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.
    gw3583 committed Sep 19, 2018