Programmable filter can add dimensions to context

Using one or more `add_dimension` options on a programmable filter will instruct the filter to add those dimensions to the primary PointContext. This way, the programmable filter can set dimensions that might not be present on the PointContext.

My use case for this is manually scaling and "renaming" a dimension coming in from a reader, e.g. this pipeline:

```xml
<?xml version="1.0" encoding="utf-8"?>
<Pipeline version="1.0">
    <Writer type="drivers.las.writer">
        <Option name="filename">output.las</Option>
        <Option name="discard_high_return_numbers">true</Option>
        <Filter type="filters.programmable">
            <Option name="source">
import numpy
def reflectance_to_intensity(ins, outs):
    ref = ins["Reflectance"]
    min = numpy.amin(ref)
    max = numpy.amax(ref)
    outs["Intensity"] = (65536 * (ref - min) / (max - min)).astype(numpy.uint16)
    return True
            </Option>
            <Option name="function">reflectance_to_intensity</Option>
            <Option name="module">pyrxp</Option>
            <Option name="add_dimension">Intensity</Option>
            <Reader type="drivers.rxp.reader">
                <Option name="filename">/home/vagrant/PDAL/test/data/rxp/130501_232206_cut.rxp</Option>
            </Reader>
        </Filter>
    </Writer>
</Pipeline>
```

The **rxp** reader, which produces the "Reflectance" value, comes from [this branch](https://github.com/gadomski/PDAL/tree/rxp-driver).