Set last modification time to value of REV: if available

If the client returns the REV: field, use its contents as the modification
timestamp. Else use the current time.
VCardProducer: only add REV node if mtime available
Log array dumps with print_r(array, TRUE)

Previous method was printing to the output buffer and scraping the output.
VCardProducer: give access to table properties

The code was incorrectly assuming it had access to the LAST_MODIFICATION_TIME
and CARDDAV_URI properties, when it did not. Those properties do not come from
a mapi_setprops() call, but from reading table attributes for the contact. Get
those attributes from the caller.
Add ETag support

Construct ETag from EntryID and last modification time. This should meet the
criterion of being unique between cards and unique between revisions of one
card. These properties are cheap to compute; we already had them.
VCardProducer: don't include 'urn:uuid' in UID prop: OSX doesn't like it

Mac OSX Contacts.app doesn't like it when the 'urn:uuid' string is included in
the UID tag; omit it. This makes synchronization work in Contacts.app.
VCardProducer: propertiesToVObject(): return TRUE/FALSE, clean up code
ZarafaBridge: only init extended properties if requested

Previously, the extended properties were always initialized; now init them only
on request when a call to getExtendedProperties() is made.
Zarafa_Folder: decrease log level in get_dav_card()

Not being able to find the requested contact in get_dav_card() is technically
an error, but log it at the low INFO log setting. Some clients, notably Mac
OSX' Contacts.app, test whether the name of a new card is available by
requesting that card and *expecting* the lookup to fail. So this "error" occurs
during normal operation. Don't pollute the logs unnecessarily.
VCardParser: add socialProfileConvert() as stub function

This function currently does nothing much, it just logs which properties it
discards from the VCard. Maybe we can preserve them somehow in the future. Add
a comment with all the social media keys we've seen Contacts.app return.
VCardParser: bugfix: don't reference nonexisting 'other_fax_number' property
VCardParser: get rid of indent level
VCardParser: 'home' telephone number without params defaults to home voice number

Previously, a number of type TEL;TYPE=home:7897987 was not matched.
VCardParser: not all parameters were properly NULL'ed out

Forgot to add some to the list after we expanded our coverage.
VCardProducer: simplify function interfaces

Make the vCard object a member of the Producer class, instead of a variable in
Zarafa_Bridge that's passed around from place to place by reference. This
simplifies the function signatures and makes the code clearer.
VCardParser: don't use versions, encapsulate variables

The code was split into different classes for different Sabre-VObject versions,
but none of the versions differed much in practice. Write against Sabre-VObject
3.x, which is the current version bundled with SabreDAV 1.8.

Change the class interfaces to not pass the 'vCard' reader object around by
reference; make it a class member variable. This makes it clearer what the code
is doing.
VCardParser: rename 'properties' to 'mapi': more descriptive

Make $mapi a class member variable; don't pass the array around by reference.
VCardParser: make simple mapping for 1:1 VCard<>MAPI tags

Don't write custom code for each and every property, put the properties into a
map array and loop over that. Much more generic.
VCardParser: store extended properties in class member var

Don't pass this variable around by reference, look it up once and store it as a
class member variable. Cleaner.
VCardParser: put address parsing logic in subroutine

For readability; the main method was a bit too big for comfort.