Gitea carries a copy of this evaluation layer, as
modules/actions/jobparser/evaluator.go says itself: "copied from
runner.expressionEvaluator, to avoid unnecessary dependencies". It now
lives in gitea.dev/actionslib/pkg/expreval, so both sides split
sub-expressions, interpolate, keep the type of a lone expression and
apply the default status check the same way.
expressionEvaluator keeps the logging and the mask of every single
evaluation, which is what the shared Evaluator takes a function for.
Signed-off-by: Lunny Xiao <xiaolunwen@gmail.com>