ENG-5956 sqlcmd error handling improvements

Restructured try/catch blocks and a few throws especially in the area of exec parameter validation, mainly to allow more consistent options for stopping immediately on error or soldiering on, and returning a proper exit code on actual errors. But also a little bit just to eliminate redundant code.

Did NOT address the clumsy code sharing between interactive and batch modes (source of batch mode bugs and lots of unwanted complexity) 
or the lack of code sharing between batch mode and the almost-yet-should-be-more identical "script file read" mode.

Did not address needless complexity and compute costs in the LIST commands, in procedure identification, and in literal string handling.
I don't think it would have occured to me to so strongly associate a comment before an "else if" as applying to all the cases that fall through to the else, and not just to those that match the "else if", but OK.

I could preface the comment with "If the line is a ". Or I could move it inside the block. Would you recommend the latter to avoid breaking the visual flow of the if/else-if/else?