bugfix: make uninstall :script accept a hash

The indentation in `CONTRIBUTING.md` implies that `:script` accepts a hash.
But that is not the case. Instead `:script` accesses the entire hash defined
by `uninstall`.  Unrelated uninstall keys such as `:quit` leak through to
`@command.run!` when attempting to exec `:script`.  Result: contrary to docs,
`:script` cannot be combined with other uninstall keys.

This PR makes uninstall `:script` accept a hash.  When `:args` or `:input` are not
needed, `:script` can still accept a plain string, so many Casks require no
alteration.

In addition
- adds key `:executable`, required when using hash argument to `:script`
- keys to `:script` are validated and sanitized before being passed to
  `@command.run!`
- adds `:quit` to `with-installable.rb` test to protect against regression
  on leaky keys

This also fixes a conflict introduced in #2019, because `:args` and `:input`
were keys in the `uninstall` hash space.