Add brew services command: a wrapper for launchctl

If a formula implements startup_plist it has out-of-the-box support by
brew services. If not it's possible to specify the path to a plist file:
`brew services couchdb-lucence /usr/local/Cellar/..../couchdb-lucene.plist`.

Fixes #3422.

Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
brew-services: fix by using formula.plist_name.

Fixes errors like:

```
 $ brew services restart mysql
Error: Formula `mysql` not installed, #startup_plist not implemented or
no plist file found
```

Closes #16378.

Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
We use formulae as the plural of formula.
Rename Library/Contributions/cmds -> cmd.
Make brew services use the correct filename

Closes #19050.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
brew-services: don't hardcode launchctl path

This change allows users to install the `launchctl` wrapper in the
`reattach-to-user-namespace` formula which makes the command work in
Tmux and other non-standard environments.

Closes #26609.

Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
Remove unnecessary usage of Formula.canonical_name
Deprecate some contributions.

This is just a starting point to start discussion. I think we have a
few options with contributions:

- Stop accepting them altogether and move the ones we need/use/support
  into core commands
- Accept them on an unsupported basis and require they be added
  manually to the PATH
- Actively support and fix bugs in them all

Closes #30749.

Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
brew-services: mkpath first if destination dir not existed