RGB <-> LabSpace memoization

PR started to address issue #9 . This is work in progress for comments and direction.

Avoiding the use of `var` and trying to use `let` as much as possible is a good practice. This could be rewritten to use `let` as follows:

```
let labValue: INVector3 = {
    var value = cache[hashValue]
    if value == nil {
        value = IN_RGBToLAB(pixel.toRGBVector())
        cache[hashValue] = value
    }
    return value!
}()
```

This creates a new scope by defining an immediately evaluated closure that returns an `INVector3`. The compiler is smart enough to inline this closure.