Improve handling of preserved comments; make custom function helpers public

# Make custom function helpers public

The set of helper functions that the built-in lib_* functions use to validate
their arguments and generate output should be part of lessphp's public API,
because they are very useful to anyone implementing custom functions.
Accordingly, this patch makes the following protected functions public:

- assertArgs
- assertColor
- assertNumber
- colorArgs
- throwError
- toBool

The patch also makes public the properties $TRUE and $FALSE, since they are
useful for writing custom predicate functions.


# Improve handling of comments

When preserveComments is set,
- The top comment in a block should not "jump" outside the block.
- Comments should retain their position relative to the rules that follow them.
- Comments should not be deduplicated.
- When a repeated rule is deduplicated, the comments that precede each
  occurrence should be consolidated above the deduplicated rule.

Because comments and whitespace are handled in tandem, the change impacts
slightly the handling of whitespace. Specifically, 'e(this is simple);' was
previously interpreted as though it were written 'e("this");'. It now causes an
error instead, which is the appropriate behavior (it's how less.js handles it).
There is an issue here: it keeps the first occurrence of the rule, not the last one. But this means that it changes the order of rules in the final output, which could change the behavior (because the last rule wins):

```css
.foo {
    padding: 0;
    padding-top: 2px;
    padding: 0;
}
```

this would be deduplicated as 


```css
.foo {
    padding: 0;
    padding-top: 2px;
}
```

and the deduplication would now introduce a top padding.