Add support for offline updates via msfupdate (and make msfupdate testable)

Some users using the binary installer in *air-gapped* networks (no external internet access) apply updates via an offline update file.  This is currently only supported in the pro/community UI.  This PR adds support for doing this via `msfupdate` as well.

Not only does this make it nice for air-gapped command line users, it is also much easier to script/automate in testing environments.

## Verification Steps:

### `msfupdate` still works in git installs
- [x] Checkout this branch (bturner-r7/feature/msfupdate-offline) via git
- [x] Run msfupdate
- [x] VERFIY: No errors.  You'll be moved to the upstream master branch, but that is as designed

### `msfupdate` still works in binary installer using online update
- [x] Install Metasploit in a virtual machine using a [binary installer](https://github.com/rapid7/metasploit-framework/wiki/Downloads-by-Version)
- [x] Manually replace `/opt/metasploit/apps/pro/msf3/msfupdate` using the `msfupdate` from this pull request: https://raw.github.com/bturner-r7/metasploit-framework/feature/msfupdate-offline/msfupdate
- [x] Create a powered-on snapshot (you'll need it later)
- [x] Run `msfupdate`
- [x] VERIFY: Update installs successfully.

### `msfupdate` works with an offline update
- [x] Restore the VM snapshot you created earlier
- [x] Obtain an offline update.  @bturner-r7 can help you locate one
- [x] Run `msfupdate --offline-file offline-update.bin` (where "offline-update.bin" is the path to the offline update file)
- [x] VERIFY: You see a `Installing update <path>` message (where "\<path\>" is the full path to the offline update)
- [x] VERIFY: Update installs successfully.


NOTE: Offline update via msfupdate doesn't work on Windows.  This will take an additional change to the pro repository.

ALSO: This PR makes msfupdate testable.  This required refactoring `msfupdate` into an object that can be mocked and tested.  I tried not to modify the actual behavior of the script, but we should still verify:

- [x] Run rspec spec/msfupdate_spec.rb
- [x] Test msfupdate in a git install.  VERIFY: it still works.
- [x] Test msfupdate in a binary install.  VERIFY: it still works.
- [x] Test msfupdate in an apt/kali install.  VERIFY: it still works.