1. You can define types and then you can specify that objects include a particular type, just as you can in Quest 4. It's a bit more efficient in Quest 5 though as the types aren't physically copied over to the object - looking at an attribute on an object will "look through" to its inherited types.
2. I've not implemented this yet, though it will be necessary for objects created at run-time.
3a. Yes, an expression can return a script, so you can do:
myobject.take = anotherobject.take
and you can set the script directly:
myobject.take => msg ("New take script")
3b. At the moment you can create lists of strings, objects or exits. You'll be able to add or remove items, concatenate lists, and check if a list contains a particular item - all the standard stuff really.
4. Yes an attribute can be a reference to another object. For example myobject.parent refers to the parent object, so you can write:
msg ("The beer is in " + beer.parent.name)
5. Yes you can use null.