[COOK-4723] Package resource enhancements

Yeah, I think this part will be good and we should get that merged.

I'm still a little concerned about uninstall_to_upgrade as it smells like a pattern we wouldn't put in core, which makes me think there should be a better way.

You can't do `action [ :uninstall, :install ]` because that's going to uninstall and reinstall on every run and I don't think we have a wonderful way to tell if something is already installed so you could do something like:
```
# pseudo-recipe
if package["foo"].installed? and ( package["foo"].current_version != package["foo"].desired_version ) do
  package "foo" do
    action :uninstall
  end
end

package "foo" do
  action :install
  version "blah"
end
```

or

```
# pseudo-recipe
def package_needs_upgrade?(name)
  if package[name].current_version != nil
    if package[name].current_version != package[name].desired_version
      true
    else
      nil # noop, shouldn't need to do anything
    end
  else
    false
  end
end

package "foo" do
  # omg, ternary, I know
  action package_needs_upgrade? ? [ :uninstall, :install ] : [ :install ]
end
```

Definitely something we need to think about long term for how to deal with this in core. /cc @adamedx @jdmundrawala @randomcamel