[flang][OpenMP] Refactor semantic check of SINGLE construct (#204339)
Extract it into a separate function and simplify the code. Avoid making
the distinction between a clause appearing on the "begin" and the "end"
directives for the purposes of emitting diagnostic messages.
One change in behavior is that using the same list item multiple times
in COPYPRIVATE clause(s) is an error regardless of the placement of the
clauses. Previously in some cases it was treated as a warning.
Part of the motivation is the goal of eliminating explicit definitions
of end-directives for directives that are not delimited, e.g. "end
single", but not "end declare_variant".