Created an abstract Publisher class to simplify configuration, view, and asset publishers

ConfigurationPublisher, ViewPublisher, and AssetPublisher all function basically the same, so I abstracted the similar code out into a Publisher class. This DRYs up the code a bunch and should make it easy to create different type of asset publishers in the future. Also, AssetPublisher used to through a runtime exception, but I just made them all throw ArgumentExceptions since ConfigPublisher and ViewPublisher were doing that already. Not sure if there was a reason AssetPublisher was different or not.

One thing I'm unsure of, is that currently it throws an exception if the directory you're trying to publish doesn't exist. I'm wondering if we want to get rid of that and instead print some red text that says something like `Views not found for package: vendor/package` in the same way to outputs a message when successful. This could fix some of the problems mentioned in #5114.



Status: Fixed Tests