* [CHD-3425] [Virtual Attendants/Code Cleanup] Fixed a PHP error regarding "Undefined variable: func in abstract_view.php" when Virtual Attendant behaviors contained list variables with a specific combination of parameters.
* [Contacts/Snippets] Fixed an issue where the names of Contact Person records always displayed '(contact person)' in snippets and Virtual Attendant placeholders.
Refactored Virtual Attendant behavior variables to support parameters for each type.

* [Virtual Attendants/Variables] Virtual Attendant behavior variables now support parameters based on each type of variable.  This provides more control over how they operate, and it also makes new variable types possible (like a picklist of pre-defined options).

* [Virtual Attendants/Variables] Text-based Virtual Attendant behavior variables can be configured for single-line or multiple-line input.  Previously, all text variables were single-line input, which made it difficult to enter certain kinds of data (e.g. long comments).

* [Virtual Attendants/Variables] Virtual Attendant behavior variables can be reordered by dragging them in the UI
* [Virtual Attendants/Variables] Virtual Attendant behaviors may specify picklist (drop down) variables.  Picklists require a worker to pick an option from a list of predefined options.  Previously, only freeform text entry was available.  This is particularly useful for macro behaviors.
[Virtual Attendants/Variables/Code Cleanup] Moved the parameter entry for Virtual Attendants into a new shared template. This functionality occurs in the schedule behavior popup on profiles, the simulator, and the 'Schedule behavior' action in VAs. These are now driven by the same code.
* [Snippets/Tester/Usability] The snippet tester now displays output with a fixed width font that preserves whitespace. Previously, tester output stripped whitespace.  This made it impossible to check the style of indentation (e.g. at the beginning of paragraphs, or in fragments of code).
* [Virtual Attendant/Usability] The Virtual Attendant action for entering custom scripts no longer auto wraps the contents of the text box.  This makes it easier to read source code.
* [Virtual Attendant/Simulator/Usability] Added an indent to the form elements in the Virtual Attendant Simulator to improve readability.
* [Virtual Attendants/Simulator/Variables] The public variables of Virtual Attendant behaviors may now be changed from within the simulator.  This makes it much easier to test macros.
* [Comments/Snippets] Implemented two new placeholders for comment records.  The 'record_watchers' placeholder is a list of watchers on the record containing the comment.  The 'record_watchers_emails' placeholders contains a comma-delimited list of watcher email addresses.  This was requested by several people who wanted a way to relay an email to all watchers about comments on records of any type using Virtual Attendants; however, it can also be used to display a list of watchers anywhere the comment is referenced.
* [Plugins/Choosers] Choosers can be opened in 'single selection' mode, where the first selection closes the chooser and returns control to the caller.  This provides all the benefits of choosers for situations where a single record must be selected.
* [Virtual Attendants/Simulator/Usability] The output of the Virtual Attendant simulator no longer has a maximum height before introducing scrollbars.  Having multiple scrollable sections made it more difficult to read the output or to scroll down the page.
[Code Cleanup]
* [Virtual Attendants/Simulator] When using the Virtual Attendant simulator, it is now possible to choose the exact record that the current behavior is being tested against.  Previously, the simulator would choose random records to help test behaviors, but this often required opening up the simulator many times in order to find a suitable record.  For macros, it was possible to run the simulator from a record profile in order to test using that record, but this option wasn't available to events like 'New message on a group conversation'.

* [Virtual Attendants/Simulator/Usability] In the Virtual Attendant simulator, data entry for parameters and values have been moved to tabs.  When a behavior provides parameters (public variables for entry by a worker), the parameters section is shown by default and the long list of values is hidden on a second tab, which improves usability by reducing clutter.
[Virtual Attendants/Simulator] Implemented simulator target choosers for the built-in contexts.
* [Virtual Attendants/Snippets] Implemented a new 'json_decode()' function for snippets and placeholders to convert a JSON string to an associative array.  This can be used to easily reference JSON results from API calls within Virtual Attendant behaviors (or snippets in special situations).
* [Virtual Attendants/Snippets] Implemented a new 'json_pretty' filter for snippets and placeholders to optimize the human readability of a JSON string.  This is mainly useful for advanced Virtual Attendant actions that exchange JSON with remote apps and services.
* [Virtual Attendants] Virtual Attendants are now first-class records (like groups and workers), with worklists, profiles, peek, ownership rights, etc.  Previously, Virtual Attendant behaviors were owned directly by roles, groups, and workers; but this was creating clutter and confusion because some behaviors are related but there was no indication of this in the UI.  Now, multiple Virtual Attendants can be created to contain any number of behaviors, and each VA can be owned by a worker, group, or role.  All existing behaviors have been migrated to a new default Virtual Attendant record for each distinct owner.  Virtual Attendants now show up in the global 'Search' menu, and clicking into a VA profile is where you will find the behavior trees and scheduled behavior.  This also provides many new possibilities for future expansion; for example, Virtual Attendants can log errors to their profile in an easy-to-find tab.  You can export and import behaviors between Virtual Attendants to place related behaviors together.
* [Messages/Performance/Snippets] The placeholder for message content is now lazy-loaded only when it is needed.  This reduces extraneous queries from hitting the database when Virtual Attendants or snippets use message fields but ignore content.
[Plugins/Platform] Implemented a Model_Worker::isRoleMember() helper method on the worker model.