datMap: Free property list object
datAnnul: Split in two

datAnnul still behaves as before in that it frees file resources
and frees the struct memory, returning a NULL pointer. The
file resource freeing now occurs in dat1Annul so that automated
freeing of locators when the last primary locator is annulled
can happen without the possibility of triggering a double
free if the caller code then explicitly annuls the secondary
locator.

This will result in some small leaking of C struct memory
and probably needs a routine to allow all these orphaned
structs to be freed properly
Tweak the calculation of primary/secondary locators

HDS closes a file and annuls all locators when the last primary
locator associated with a file is freed. This was implemented
in v5 by using a per-file_id accounting of primary locators. This
does not work as expected though because HDF5 issues a new file_id
even when the same file descriptor is being used. The count for
primary should include all file_ids associated with a single
file.

The code now retrieves the underlying file descriptor and
frees all file_ids-associated locators when the total primary
count for the file descriptor hits zero.

Without this ndfcopy of a SMURF makemap file simply did
not work as the locators were annulled too early.