An optional type for BinPAC++.

    print optional(1);
    print optional(b"ABC");
    print optional();

    global X: optional<bytes>;
    global Y: bytes;

    X = optional(b"ABC");
    X = optional();
    Y = optional(b"ABC");
    X = Y;

Implemented as a single element union in HILTI.

TODO: Add an operator for checking if an optional value is set.
Optional tuple elements for BinPAC.

If a tuple constructor uses the "try attribute" operator (.?) to set
one of its elements, the type of that element will be become
optional<T> (with T being the type of the element). If the tried
attribute isn't set, the optional will be left unset and not trigger a
failure otherwise. Note that this works even of the try attribute
operator is nested inside other expressions.

    # cat a.pac2
    module Mini;

    type test = unit {
        a: bytes;
        b: bytes &default=b"foo";
    };

    global t: test;
    t = new test;

    print (1, "string", t.?a, t.?b);
    print (1, "string", b"X" + t.?a, b"X" + t.?b);

    # pac-driver a.pac2
    (1,string,<unset>,foo)
    (1,string,<unset>,Xfoo)

The Bro plugin uses this to allow leaving record elements unset in
*.evt files: when using tuples to construct a Bro record, an optional
element will transfer over to the record accordingly.
Fixing broken test.