[SPARK-2973][SQL] Lightweight SQL commands without distributed jobs when calling .collect()

By overriding `executeCollect()` in physical plan classes of all commands, we can avoid to kick off a distributed job when collecting result of a SQL command, e.g. `sql("SET").collect()`.
Good idea. Refactored a bit, now `Command.sideEffectResult` return `Seq[Row]` and `Command.executeCollect()` simply returns `sideEffectResult.toArray`.