call scope.$apply() after modifying the model so watches fire
remove should attempt to use the itemValue function even on strings because the itemValue function can be used to make tags case insensitive. if itemValue doesn't return a value we can fall back to just using item.