Code cleanup
* [Virtual Attendants] Fixed a warning if the 'month of year' or 'day of week' conditions were used on VA behavior and no options were selected.
* [Performance/Custom Fields] Improved the performance of custom field lookups.  Previously, all custom field database tables were blindly checked for values.  Now we'll only scan the tables  for the custom field types applicable for a given object.  For example, if an object type (e.g. tasks) only has a string custom field, the 'number' and 'club' tables won't be checked.  If no custom fields are defined for an object then lookups are bypassed entirely.  This reduces the number of queries made to the database.

* [Performance/Custom Fields] Combined the multiple custom field value lookup queries into a single UNION ALL query.  This reduces the number of queries and roundtrips to the database server while serving requests.
* [Virtual Attendants/Editor/Simulator/Usability] When editing actions on a Virtual Attendant behavior, you can now choose between 'Save & Close' and 'Save & Continue'.  The former was the default behavior in the past, and the latter allows you to make changes to the actions and test them in the VA Simulator without having to constantly reopen the action editor popup.
* [Virtual Attendants/Editor/Snippets/Usability] When testing snippets in the Virtual Attendant action popup, the tester will no longer be closed automatically when you re-focus the text box.  This made it tedious to adjust and test snippets.
* [Virtual Attendant/Snippets/Simulator] The Virtual Attendant behavior simulator can now display output for actions to describes the changes that would have occurred.  For example, a comment that's created with placeholders will show the translated content, as well as the workers that would be notified about it.  Plugins can take advantage of this feature by implementing the simulateActionExtension() method on devblocks.event extensions.
List variables in Virtual Attendants

* [Virtual Attendants/Behavior Variables/Collections] Virtual Attendants can now use their own worklists to gather information and make decisions. You can now add list-based variables to VA behavior.  VAs can populate these lists with objects using a combination of presets, and then use the results in conditions and actions.  For example, with a 'Task List' variable, a VA can then search tasks using presets for 'Overdue' and 'Watched by me'.  The results can be filtered, sorted, and limited; and multiple lookups can be combined with addition (add to list), subtraction (remove these from list if they exist), and replacement (only use this list).  For another example, you could use presets to set a worker list variable to 'Admins' and 'Active within the past hour'. This variable could then be used instead of an explicit worker list when sending notifications, adding watchers, etc.

* [Virtual Attendants/Behavior Variables/Collections] List variables can be used as conditions.  This is a comparison of the number of objects in the list (e.g. greater than zero).
* [Virtual Attendants/Plugins/Development] When running actions on VA behavior,the $values dictionary will now always contain a reference to the trigger with the key '_trigger'.  This can be used to access information about the behavior, like variables or the decision tree.
* [Platform/Search/Development] Fixed a bug that broke queries with nested (GROUP_OR/GROUP_AND) virtual fields.  This was discovered when combining multiple presets on a single worklist.
* [Devblocks/Platform/Plugins/Development] Added a 2nd convenience argument to Extension_DevblocksContext::getAll($as_instances, $with_options) to load contexts with specific options set.  $with_options can be a single string, or an array of strings.  These are compared to the context options set in the plugin.xml manifest (e.g. create, find, snippets, va_variable, workspaces).
* [Virtual Attendants/Variables/Plugins/Development] The 'Add Watchers' action in VA behavior can now use a worker list variable for the watchers to add.  It can also use any list variable for the records to add the watchers to (opposed to the current record).  For instance, an org macro could use this functionality to add a list of watchers to every ticket from the current organization.
[Plugins/Platform/Development] Implemented two DevblocksEventHelper static methods (onContextsVar and mergeWorkerVars) to assist with implementing variable support in VA conditions and actions.
* [Virtual Attendants/Variables/Plugins/Development] The 'Create Comment' action in VA behavior can now use a worker list variable for the 'notify workers' option.  It can also use any list variable for the objects to comment on (opposed to the current object).  For instance, a ticket macro can comment on the oldest tickets that are at risk of breaking a service level guarantee, and the workers to notify could be group managers who are currently logged in.
* [Virtual Attendants/Variables/Plugins/Development] The 'Create Notification' action in VA behavior can now use a worker list variable for the people to notify.  It can also use any list variable for the objects to link the notification to (opposed to the current object).  For instance, a task macro can send notifications to the current worker about all their overdue tasks (this could also happen at every login).
* [Virtual Attendants/Variables/Plugins/Development] The 'Create Task' action in VA behavior can now use a worker list variable for the watcher and notification options.
* [Virtual Attendants/Create Ticket/Variables] Watchers can now be added when creating a ticket from a VA macro.  The watchers can come from a list variable on the behavior.

* [Virtual Attendants/Create Ticket/Links] When creating a ticket from a VA macro, it will now be linked to the current object if one exists.  For instance, if creating a ticket from an organization macro.

* [Virtual Attendants/Create Ticket/Snippets] Snippet placeholders can now be used in the 'recipients' field when creating a ticket from VA behavior.
Fixed an issue where macro classes weren't calling their DevblocksExtension parent constructor.
Refactored the Virtual Attendant simulator.  Moved $dry_run into runAction rather than a separate simulateAction.  This also implemented simulator for VA action extensions.  Improved the VA simulator output to show the true action name rather than the aggregate one.
* [Virtual Attendants/Simulator/Variables] Implemented the Virtual Attendant simulator action for setting variables. This lets you easily preview the values being selected from your 'set variable' action.
* [Knowledgebase/Usability] The 'Knowledgebase Category' object type will no longer show up in places it doesn't belong (e.g. snippets, create & link, workspaces)