Create an abstract class Publisher 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. 

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.