Implement pp6calculator Day 4 Menu

Add new menu for Day 4 exercises and homework, only providing quit
operation for now.
Implement pp6calculator Day 4 Exercise 1 solution

Add template method `getField` method to `FileReader` reading and
returning the supplied field as the templated type. If input fails,
set the failed flag to true and return a default constructed instance
of the template type.

Add supplied `pdg.dbt` to top level of project, and copy it to base
of project build directory so it's easily accessible to pp6calculator.

As per exercise, add operation to Day 4 menu to read in a .dbt format
file, iterate over the lines and print each field to stdout.
Implement pp6calculator Day 4 Exercise 2 solution

Use std::vector to store columns of data from .dbt file read in
by the `pp6day4_io_pdg` operation. Display data by looping over the
vectors and using the subscript operator to access the data.
Implement pp6calculator Day 4 Exercise 3 solution

Use iterators to iterate over vectors of data (columns) in
`pp6day4_io_pdg` to present data to stdout.
Implement pp6calculator Day 4 Exercise 4 solution

Implement ParticleInfo class for querying properties of a particle by
its PDG name or code. Provide public interface as per design discussion
on day 4. Use maps to provide lookup tables against PDG name or code.
Construction takes a .dbt file as input to fille the tables. If the
file is not readable or of the wrong format, the database will be empty.
Use the `size` method to indicate an empty, and hence invalid, database

Add operation to Day 4 menu calling new `pp6day4_check_particleinfo`
function. Inside function, query user for .dbt file and instantiate a
ParticleInfo instance using this file. Perform simple checks on the
resulting instance to test that it contains entries, and that
information on muons and antimuons is returned correctly.
Implement pp6calculator Day 4 Exercise 5 solution

Add operation to Day 4 menu calling new `pp6day4_algorithm_demo`
function. Query user for size of vector to generate, restricting the
size to a number between 10 and 100. If the user enters an invalid
number, simply ask them again.

Create a vector with the required capacity, use `std::generate` to fill
the vector with random numbers from the PP6Lib getRandom function. Use
a `std::ostream_iterator` to report the contents before and then after
sorting it with the STL `sort` function. Also use the `std::max_element`
and `std::min_element` to find the maximum and minimum values if the
vector, reporting these to stdout.
Complete Day 4 Exercise Solutions

Update README News section to note addition of Day 4 exercises.