Allow passing a function to describedAs in addition to hardcoded String

This more closely acts like overriding toString (which is effectively
what this is supposed to do), because toString is a method, not a field.
This allows consumers to describe a Condition or Event with something
that cannot or should not be evaluated immediately.