WIP: support combiners for UDAs

- [x] Associate an optional decomposable state with UDAs; this guides the decomposition into local, remote aggregates
- [x] Expand decomposable UDAs in a new optimizer rule
- [x] Test a simple sum UDA using this new framework
- [x] Plumb syntax for specifying combiners into the Myrial language
- [x] More tests!
- [x] Clean up redundancy between built-in aggregates, UDAs

Sanity tests appreciated.
I'm having trouble understanding why the finalizer is present. Look at how it's used, It seems to be mutually exclusive with there being local or remote `statemods`. Is this just so you don't have to rewrite the full statemods for built-in aggregates?