NH-3488 - Strongly Typed Updates and Deletes

https://nhibernate.jira.com/browse/NH-3488

The bulk of the code in the commit is the unit tests, which is a copy of the tests in Hql/Ast/BulkManipulation.cs. 

It would have been nice to reuse the same code but almost all the mappings in the original have casing problems, i.e they refer to lower case properties, but the properties are not lower cased. The HQL tests work, since they refer to the mapped properties, not the real ones. One solution would have been to check against the mapping, but I found the existing behavior strange and other parts of the Linq implementation doesn't do this, so I'll leave it as is for now.

The goal was to provide the new functionality by deriving from the existing Linq system, but that was easier said than done. Lots of code in NHibernate is very hard to derive from, with static calls and massive amounts of logic in the constructors. I decided to create derived types of NHLinqExpression, and handle most of the initialization in the constructor call. I could have created a derived QueryModelVisitor and IntermediateHqlTree too, but opted not to.

The syntax for the update and insert is worth discussing, but I wanted to support but a member initialization version and an explicit one. They could not be implemented with the same method name, since the compiler then sometimes will not be able to distinguish between the overloads.

For inserts we have:

session.Query<Cat>().Insert().As(x=>new Dog{Name=x.Name});

or

session.Query<Cat>().Insert().Into<Dog>(x=>x.Set(y=>y.Name,y=>y.Name));

For updates we have:

session.Query<Cat>().Update().As(x=>new Cat{Name=x.Name + " the cat"});

or

session.Query<Cat>().Update().Assign(x=>x.Set(y=>y.Name,y=>y.Name + " the cat"));

A better name than "Assign" is welcome. Or maybe for "Set".