data: Let CONCAT return NULL if any of its operands is NULL.

This mimics behavior in SQL and also allows for missing values to be reported
as NULL and propagate that information.
data: Added explicit NULL values.

… and let all expressions involving NULL values to return NULL.
store: Return NULL if an attribute was not found.
frontend/grammar: Make IS NULL operators available to any expression.
frontend/grammar: Fixed parsing of 'attribute[<string>]'.

That is, don't accept anything besides the string "attribute". Previously,
<anything>[<string>] was accepted as an attribute value.
store: Clarify behavior of expr_attrvalue if the attribute does not exist.
data: Added sdb_data_sizeof().

This function returns the size of the data-type for a given type.
data: Use if-statements rather than switch-statements.
data_test: Removed unnecessary and possibly misleading checks.
data: Added basic support for arrays.

An array may contain elements of one type and it's stored in compact raw form
(as in: not an array of union values but an array of the actual values).
'copy', 'free', and 'concat' operations are currently supported but limited to
integer, decimal, or string element types. ENOTSUP is returned for any other
operations.
data: Fixed length of newly allocated array in concat().
data_test: Use int64_t instead of int for integer array data.
data: Added support for comparing integer, decimal, and string arrays.

Array comparison works element-by-element, returning how the first non-equal
elements compare to each other.

Added tests for array comparison and concatenation.
store: Added support for querying the BACKEND field.

… returning an array of strings.
data: Added sdb_data_inarray().

The function determines whether a value is included in an array.
store: Added sdb_store_in_matcher().

This function creates a matcher which matches if the right value evaluates to
an array value and the left value is included in that array.
frontend/grammar: Added support for the IN operator.

This is a matcher checking if a value is included in an array. It's mostly
meant to be used to match backends at the moment.
t/: Let tests use '<expr> IN .backend'.
store: Let compare matchers fail if any of the operands is NULL.
frontend/grammar: Unified field and attribute value matchers.

Use generic expressions and the new compare matchers instead.

As a side-effect of this change, not-operators (!=, etc.) no longer match on
NULL values (attribute does not exist). This is intended and should have been
like this in the first place (we've got 'IS NULL' for that purpose). For
example, `attribute['foo'] != 123' did previously match if attribute 'foo' did
not exist but now this is no longer the case.