[Fix #655] Improve the error highlighting logic

The old code was pretty inconsistent - it was using one type of function
to find the beginning of the region to highlight and another to find its end.

Now we try to find a list, vector, map or set literal opening bracket and jump
to its closing bracket from there. We also take care not to be fooled by strings.