Altered object locking behaviour and allowed function/sequence declarations to be used on the right-hand side of the pipeline operator.

**Complete changelog**:

* Pipeline operator now accepts function declarations as rvalues. Regular function calls remain unchanged.

```
var numbers = [ 1, 2, 3, 4, 5 ];

//All 3 are functionally equivalent.
var cubes = numbers |> seq( nums ) {
    foreach( var n in nums )
        yield n ** 3;
};

var cubes = numbers |> ( seq( nums ) {
    foreach( var n in nums )
        yield n ** 3;
} )();

seq cubeAll( nums ) {
    foreach( var n in nums )
        yield n ** 3;
}

var cubes = numbers |> cubeAll();
```

* Locking behaviour has been changed to allow an object to have three possible lock states. They are as follows:
    * **None** - object is not locked and is completely mutable.
    * **Locked** - I refer to this as a soft lock, existing fields cannot be removed, but their values may still be changed and new fields can be added. Once an object has been locked, it cannot be unlocked. This is in line with current locking behaviour. Soft locks can be "upgraded" to hard locks.
    * **Frozen** - I refer to this as a hard lock, the object is completely immutable. Fields cannot be added or removed, and their values cannot be changed. This is default for the value prototypes and prototypes generated by the binding API. Hard locks are absolute; once an object is frozen it cannot be unfrozen.

* Objects can now be locked/frozen from Mond userland code by way of the `lock()` and `freeze()` instance methods on the object prototype.