[NuGet] Check NuGet packages when project target framework changed.

Show warnings about packages needing to be reinstalled in the Package
Console.

Add Reinstall menu option for a package in the Solution pad so a NuGet
package can be uninstalled and installed with one action.
[NuGet] Add tests for package compatibility checks.

Ensure project target framework changed events do not fire for all
project properties that are changed.

Ensure packages needing reinstallation are highlighted in Solution pad
with warning text and icon.

Ensure incompatible packages are detected, marked in the
packages.config file, and shown in the Package Console.
[NuGet] Clear requireReinstallation in packages.config file on revert.

Changing the project target framework to one that requires the NuGet
packages to be reinstalled and then changing it back again to the
original target framework now removes the requireReinstallation
attribute from the packages.config file. Previously the
requireReinstallation attribute was not removed and the Solution pad
would incorrectly show an error with the package.
[NuGet] Add tests for reinstalling a package.
[NuGet] Allow package reinstall when other packages depend on it.

Forcefully uninstall a NuGet package to make sure the uninstall does
not fail when other NuGet packages depend on the package being
uninstalled.

For example, Ninject and Ninject.Extensions.Xml installed into a
project that targets .NET 4.0. Ninject.Extensions.Xml depends on
Ninject. Trying to remove Ninject will fail but reinstalling Ninject
should succeed.
[NuGet] Reformat Package Console output from compatibility check.

Add new line between incompatible NuGet packages message and the
list of NuGet packages.
[NuGet] Support reinstalling all packages for a project in one step.

Add 'Reinstall' right click menu option on the Packages folder in the
Solution pad. All project packages will be uninstalled and then
re-installed when this menu option is selected.
[NuGet] Reinstall menu available only when packages need a reinstall.
[NuGet] Fix package errors being logged twice.
[NuGet] Reduce packages.config file reads.

When the target framework is changed in project options the
ProjectModified event is raised twice. Once for the project's
BaseDirectory and once for the projects' TargetFramework. The
ProjectModified event then causes the Packages node to be reloaded.
Each Packages node refresh would cause two separate reads of the
packages.config file. The results of the first read are now cached
until the Packages node is refreshed.

This logic can be improved further to prevent multiple reads of
the packages.config file when nothing has changed. This would require
the current state of a project's package references to be cached
instead of relying on the packages.config file. Or a way to determine
that the packages.config file has been updated and should be re-read.
[NuGet] Fix access denied error when target framework changed.

Fix UnauthorizedAccessException: Access to the path
'd:\Test\packages.config' is denied. This would occur when the target
framework of the project is changed to one that requires the
project's NuGet packages to be reinstalled.

The Solution pad is updating the Packages folder by reading the
packages.config file at the same time that the compatibility checker
is checking the NuGet packages are compatible in the background. When
the packages.config file is updated with requireReinstallation="True"
this can occasionally fail due to the file being read at the same
time. Short term fix is to update the packages.config on the UI
thread. Longer term fix is to use better logic when the Solution pad
needs to update the Packages node.
[NuGet] Add tests for reinstalling all project packages.
Merge branch 'master' into nuget-support-v2
[NuGet] Improve console output after project target framework changed.

In the Package Console show more information:

1. Show packages that are compatible with the new project target
framework but require a reinstall.
2. Show packages that are incompatible with the new project target
framework.
[NuGet] Show status bar error for incompatible packages.

Previously if a package was found to be incompatible with the new
project target framework it was reported as a warning in the status
bar. Now it is reported as an error.
[NuGet] Use Retarget instead of Reinstall for menus and messages.

The existing terminology in the user interface uses Add and Remove
instead of Install and Uninstall. Replace "Reinstall" with "Retarget"
to indicate the action is a retarget of the package so it uses the
correct target frameworks for the project.
[NuGet] Remove duplicate messages in Package Console when retargeting.
[NuGet] Add component to check for updated packages.

UpdatedPackagesInSolution looks at all the projects in the current
solution and checks for updated packages in each project. Information
on the updated packages is cached so the Packages folder can use this
information in the Solution window. Currently the UI is not updated.
[NuGet] Check for updated packages when the solution is opened.

Use a startup handler "/MonoDevelop/Ide/StartupHandlers" to ensure the
package updates are checked after packages are restored. There is an
existing package restore startup handler which is run first.

When the solution is closed the information about updated packages is
cleared.
[NuGet] Add event indicating updated packages are available.

The UpdatedPackagesAvailable event will be used to trigger the
Solution window to refresh its Packages folder and show information
about any updates.