Refactor how text shadows and elements are handled.
While working on adding line decorations, I kept running into issues and extra complexity. Instead, I've refactored how text shadow contexts are handled. The implementation is a bit complex in parts, but conceptually this fits in much better with how the frame builder, prim store and GPU cache work. Now, text-shadow primitives add text runs and decorations as sub-primitives, using an index buffer of primitives. This means: * The code to manage the text-element stack and maintain correct paint order is much simpler. * The GPU cache layouts are much simpler. Text runs and decorations within a text-shadow element have the same layout as normal primitives (no weird offsets and packed layouts). * Text primitives that have both visual and shadows (which is the common case) share the same GPU primitive - so they only get built and uploaded once. This is quite a large performance win on pages with a lot of shadows. * The code to truncate glyph positions is moved from the CPU to the vertex shader, which is a significant performance win. * The paint order of shadows is reversed from the previous implementation, back to what it was originally.