Implement EZP-22103: Search and sort by MapLocation in API

This PR resolves issue https://jira.ez.no/browse/EZP-22103

This implements MapLocationDistance criterion and MapLocationDistance sort clause.

Both criterion and sort clause apply only to MapLocation field type values and implement `CustomFieldInterface`, meaning for the Solr Storage custom field for specific type/field can be targeted.

As for calculating a distance reference location is required, criterion uses new `MapLocationValue` class and sort clause uses new `MapLocationTarget` class to structure this additional data. These are used internally, meaning criterion and sort clause constructors accept only scalar values.

Distance for both criterion and sort clause is given in kilometers.

Example of the search query:

```php
$query = new Query(
    array(
        'filter' => new Criterion\LogicalAnd(
            array(
                new Criterion\ContentTypeIdentifier( "apartment" ),
                new Criterion\MapLocationDistance(
                    "maplocation",
                    Criterion\Operator::BETWEEN,
                    array( 1, 2 ),
                    $office["latitude"],
                    $office["longitude"]
                )
            )
        ),
        'offset' => 0,
        'limit' => 10,
        'sortClauses' => array(
            new SortClause\MapLocationDistance(
                "apartment",
                "maplocation",
                $office["latitude"],
                $office["longitude"],
                Query::SORT_ASC
            )
        )
    )
);
```

For now Legacy Storage implements only Euclidian distance formula, which is precise for short distances. Bounding box limitation is done to improve performance by excluding locations that we can now will not fit the distance conditions. Only outer bounding box is implemented, meaning it will be applied with `LT`, `LTE` and `BETWEEN` operators (for `BETWEEN` it applies only to maximum distance).

Solr Storage of course works with Great-circle formula which is precise for all distances.

#### Notes

* This does not implement returning distance value. That is something that will need to be calculated in app layer.
* Legacy Storage MapLocationDistance sort clause will filter out all Content that does not have MapLocation field. This is because we need to use JOIN to get the sort expression in the SELECT list. As far as I'm aware there is no sane way around this.

#### Implementation of this required following changes

* GeoLocation search field type is introduced, mapping to LatLonType in Solr. Field name generator and Solr schema already defined PointType for this purpose, but LatLonType is better suited as distance calculations with it use spherical Earth model (instead of flat in case of PointType).
* `FieldNameGenerator` now uses `_` to glue field name, because of the problems appearing with `geodist()` function.
* As MapLocation stores both address and location coordinates, `FieldMap` now maps field names using additional array level with search file type type name as a key. This enables criterions to target specific fields in Solr storage, in this case only location coordinates and not address.

#### Additional fixes

* Solr Storage Search handler now uses `FieldNameGenerator` to generate field name
* MapLocation Type now accepts both float and integer values
* Various small CS and typo fixes

#### Future follow-ups for Legacy Storage

* Calculating distances across date line with Euclidian formula (requires ABS function which is not available in Zeta Database)
* Great-circle formula (requires trigonometry functions which are not available in Zeta Database)
* Inner bounding box limitations to improve performance