[COOK-4723] Package resource enhancements

The exception handler *silently* handles those scenarios, but also potentially others which we'd want to know about. While NoMethodError effectively means there was no match, there could be other reasons that NoMethodError is raised, especially if code is refactored in the future. I still think explicitly checking for a match as I described earlier would be better. 

I see your point about a possible syntax error and we should be verbose about that too, but we're also silently making a choice when there's multiple matches (the first one), which is going to be a bug.

Consider something like this:

```
def current_installed_version
  package_name = @new_ressource.package_name
  @current_installed_version ||= begin
      if installed_packages.include?(@new_resource.package_name)
      Chef::Log.debug("Found exact installed package for: #{package_name}")
      installed_packages[@new_resource.package_name][:version]
    else
      Chef::Log.debug("No exact match installed for '#{package_name}', searching for partial matches.")
      begin
        matching_packages = installed_packages.select { |k,v| v[:name] =~ /#{package_name}/ }
      rescue SyntaxError
        raise SyntaxError, "Error while matching '#{package_name}' against installed packages, invalid characters?"
      end

      if matching_packages.empty?
        Chef::Log.debug("Unable to find installed package matching '#{package_name}'"
        nil
      elsif matching_packages.size > 1
        raise ArgumentError, "Found multiple installed packages matching '#{package_name}'"
      else
        found_package = matching_packages.first[1]
        Chef::Log.debug("Matched '#{package_name}' to #{found_package[:name]}")
        @current_resource.package_name(found_package[:name])
        found_package[:version]
      end
```