optimize string concat

Instead of a deep chain of ((((a . b) . c) . d) . e), optimize
it to be actually (a . b . c . d . e), as String.Concat() can
take an array of arguments.

Also add support for all kinds of compound assignments.