Don't upgrade a brew that is already up to date

Fixes https://github.com/thoughtbot/laptop/issues/257

On a clean OS X Mavericks, Laptop outputs an error message towards the end of
the install script when `brew_install_or_upgrade` is invoked for OpenSSL:

    Upgrading and linking OpenSSL ...
    Error: openssl-1.0.1h already installed
    Linking /usr/local/Cellar/openssl/1.0.1h... 1139 symlinks created

The current version of OpenSSL was installed earlier as a dependency of
PostgreSQL. In general, a similar error will be logged whenever
`brew_install_or_upgrade` is called for an installed package that's already up
to date.

Currently, Laptop discards the error exit code of `brew upgrade` as follows:

    (brew upgrade "$@") || true

In addition to logging an error when there isn't truly an error, this approach
can cause real `brew upgrade` errors and potential bugs in Laptop to be masked
(e.g. Homebrew formula build failures or Laptop mistakenly invoking `brew
upgrade` for a package that isn't actually installed).

I think a better approach would be to check whether the installed package is the
same version as the current Homebrew formula before attempting `brew upgrade`.
Make brew_install_or_upgrade work with aliases

Fixes https://github.com/thoughtbot/laptop/issues/258

The following doesn't behave as intended:

    brew_install_or_upgrade 'postgres'

because "postgres" is an alias, not the full name of the formula. The actual
formula name is "postgresql".

The first time `brew_install_or_upgrade 'postgres'` is invoked it works as
expected — `brew install postgres` is run. Additional invocations result in
`brew install` instead of the expected `brew upgrade`.

The `brew_install_or_upgrade` function uses `brew list -1` to obtain a complete
list of installed packages, and these package names will be the actual package
names. So, grepping for an alias (with the `-x` option) won't match:

    $ brew list -1 | grep -Fx postgres

Note that there's no output, even though PostgreSQL is installed. Using the full
package name behaves as expected:

    $ brew list -1 | grep -Fx postgresql
    postgresql

Rather than passing on the first argument to `brew_install_or_upgrade` to the
`brew list` commands, the argument should first be expanded to the actual
package name.
Test whether Homebrew formula is installed

More readable and testable this way.
Fix warning when linking already-linked OpenSSL

Fixes https://github.com/thoughtbot/laptop/issues/259

Laptop raises the following warning on `brew link openssl ` when OpenSSL has
already been linked:

    Warning: Already linked: /usr/local/Cellar/openssl/1.0.1h
    To relink: brew unlink openssl && brew link openssl

I think the resolution is straightforward: follow Homebrew's recommendation and
`brew unlink` before `brew link`. I verified that `brew unlink` exits with
success even if the formula wasn't previously linked as would be the case the
first time Laptop is installed.
Add idempotent brew_launchctl_restart function

Fixes https://github.com/thoughtbot/laptop/issues/260

This is a soft error that occurs when Laptop is run and PostgreSQL isn't
currently loaded by `launchclt`, e.g. on the first run of Laptop:

    Starting Postgres ...
    /Users/wellmade/Library/LaunchAgents/homebrew.mxcl.postgresql.plist ->
    /usr/local/opt/postgresql/homebrew.mxcl.postgresql.plist
    launchctl: Error unloading: homebrew.mxcl.postgresql

The fix would probably be to check `launchctl list` to see if the service is
already loaded before calling `launchctl unload`.

This small added complexity probably justifies a function for running
appropriate `launchctl` commands. Homebrew has a strong convention for the
naming of `launchd` plists: "homebrew.mxcl.FORMULA_NAME.plist", e.g.
"homebrew.mxcl.postgresql.plist" and "homebrew.mxcl.redis.plist". This likely
makes a function to do the `launchctl` work fairly straightforward.
Upgrade to latest version of Node.js

We can future-proof the script little more by setting `node_version` to 0.10.
NVM will automatically install the latest 0.10.x version:

https://github.com/creationix/nvm#usage