Add new get_combined_holdings() method to MFHD.pm

This commit adds a new method to the MFHD module which creates an
array of compressed holdings from all holdings for a given caption,
combining as needed.

NOTE: This method is similar to, but much less aggressive/strict than
get_compressed_holdings(). Ultimately, get_compressed_holdings()
might be deprecated in favor of this.

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Tie in new MFHD method to serials module/MFHD tests for compressing, combining

[This commit has been squashed for merging. LFW]

 *  Now that we have a potentially better alternative, let's call
    get_combined_holdings() in place of get_compressed_holdings() in
    Serial.pm.

 *  First, add a test for the new get_combined_holdings() method.

    Second, add a known problem case for get_compressed_holdings().
    The fix will come in a subsequent commit.

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Fix logic in get_compressed_holdings()

[This commit has been squashed for merging. LFW]

  * This commit rearranges some of the logic branches to protect
    against an unusual case of having two holding statements with
    the same start value, but one being open-ended and one not.

  * The logic in get_combined_holdings() was a little sloppy and
    repeated some steps unnecessarily.  This cleans things up.

    See the test case in the previous commit for more clarity.

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Solidify caption/holding relationship, improve MFHD::Holding comparisons

[This commit has been squashed for merging. LFW]

  * This commit:
    - Makes sure that holding data is valid for the given caption
      for new holding objects
    - Teaches field_values() to fall back to '*' (unknown marker)
      when a holding is missing data
    - Allows the caption() method to be a setter

  * This commit:
    - Makes the comparison operator consider chron data, not just
      enumeration data
    - Teaches the comparison operator a way to handle 'unsure' data
      (that is, data presented in brackets [])

  * The code was assuming the $end_holding param would be uncompressed,
    but this was not stated anywhere, nor enforced.  Let's allow the
    method to take both compressed and uncompressed holdings as the "end"
    (and handle it appropriately).

  * Add some holdings with missing and unsure data to test the new
    comparison operators handling of such data.

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>