Improve virtual fields generation:

* Delegate model virtual fields extraction to the Model at issue.
* Virtual fields can be extracted from a list of fields which can contain expressions.
* Extracting virtual fields from different fields list, resulting in the same virtual fields generates the same cache key.

When building the cache key, it will be the same when:

* fields (which can contain expressions) are duplicated.
* fields are empty.
* virtual fields are qualified or unqualified.
Test that fields() method builds different cache keys when using virtual fields with the same key but different expressions.