Fix fuzzer-discovered timeout by caching uniform information.

StructType now tracks if the struct is eligible for use as a
uniform. If it is not, it tracks the Position of the member
that caused it to become ineligible for use as a uniform.

This design allows `isAllowedAsUniform` to be implemented as
a constant-time lookup instead of a recursive check; this
solves a fuzzer issue. These changes alter the error message
behavour slightly, but I think the reports are more-or-less
equivalent from a user perspective.

Bug: oss-fuzz:66356
Change-Id: Idf15f82a6902f32373b7081ed45c27fa2e857f87
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/808658
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
14 files changed