More than a dozen, and like I said the bigger problem is my custom taxonomy.
The problem is definitely in how Select2 is getting the information passed to it — in js/fields/select2-terms.js, line 33, information.results is an array the first time through, and always an object after that. I’m not 100% sure why that is (your controllers/ajax/campaigns.php is returning arrays), but I suspect it has something to do with the json serialization, which is a problem I’ve encountered before when trying to deal with Ajaxing stuff out of WordPress.
While I don’t have time to investigate the root problem of why it’s turning up as an object instead of an array, I did whip up a simple patch that at least makes it work (maps the problematic object to an array) if you insert this into select2-terms.js at line 33:
if (!jQuery.isArray(information.results)) {
information.results = jQuery.map(information.results,function(value,idx) { return [value] } )
}