parse keyword arguments as (kw x y) instead of (= x y)

this also preserves the order of the x=y pairs in the original arg list.

this change fixes several problems, since keyword arguments are not really
assignments, and should be distinguished from x=y in other contexts such as
    (x=y) + 2
    {x=y}

fixes #3346

give an error for optional positional args not at end. fixes #3143