Refactor stack management in SkRP codegen.

Previously, we had a simple mechanism that let us reference a
"next stack" and "previous stack." This worked well as ephemeral
storage in `pushExpression`, as long as we always finished with
the storage by the time we were done pushing the expression.

This redesigned approach lets stacks get created and recycled on
demand. This can replicate the previous approach, but it also
gives us the ability to hold onto expressions for a longer
duration. This can provide a mechanism for implementing temporary-
lvalue storage.

This approach caused lots of ripple effects in the golden outputs
as the stacks can be ordered slightly differently than before, but
nothing is meaningfully different; it's the same work in different
slots.

Change-Id: I0634e7591b3b67771ec59527f461a053fb12fbc8
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/641696
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Arman Uguray <armansito@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
13 files changed