Changed HardwarePalette.ApplyModifiers to be more efficient.

It will no longer copy the dictionaries or palettes every time, saving significantly on allocations.
Non modifiable palettes are copied to the buffer when they are added, rather than having to be done repeatedly in ApplyModifiers.
The palettesModified flag tracks if the current texture represents unmodified palettes. If it does and no modifications are made then it doesn't have to update the texture at all and can bail early. This is often the case because the paletteMods sequence is usually empty.
We always have at least one modifier, so this will always be set true.  It might make sense to instead change `AdjustPalette` to return a bool indicating whether it updated the palettes, and aggregate across those.