Topic/plat 6858

* Implemented **ProductPiecewisePolynomialInterpolator** and its wrappers, **ProductPiecewisePolynomialInterpolator1D**, **ProductPolynomialExtrapolator1D** and **ReciprocalExtrapolator1D**. 
* All of these have test classes, **ProductPiecewisePolynomialInterpolatorTest**, **ProductPiecewisePolynomialInterpolator1DTest**, **ProductPolynomialExtrapolator1DTest** and **ReciprocalExtrapolator1DTest**.  
Linear extrapolation and flat extrapolation are two common ways of extrapolation without adding extra node points/condition outside the data range. The latter can be derived from the former. Thus I set the linear as a default. 

The reason only right extrapolation is explicitly computed is as follows: 
The pp contains a set coefficients based on left node point of each interval, i.e., f(x) = a[0] * (x-x[j])^3 +  a[1] * (x-x[j])^2 + a[2] * (x-x[j])^1 + a[3] where x[j] is the left node point of the interval. Thus, to complete the right linear extrapolation, we have to compute first derivative value at x[j+1] (doing this computation in Interpolator1D causes a troublesome because it leads to reconstruction of PiecewisePolynomialResultWithSensitivity), while left linear extrapolation is trivial (just using the lowest and second lowest coefficients). 

The linear extrapolation can be changed by adding extra node points right to the data range. I'll add comment on this and the left extrapolation.