Add linear ramp (trapezoidal) rise time mode
Adds a third signal shape alongside step and exponential:
- riseShapeLinear(dt, tr): clamp(dt/tr, 0, 1) — matches SPICE PULSE source behaviour
- sumEventsWithLinearRamp: applies linear ramp to each bounce event
- computeDynamicState: accepts riseTimeTr alongside existing riseTimeTau
- waveVoltageAt / totalVoltageAt: tr parameter selects linear over exponential
- UI: new "Linear ramp (trapezoidal)" option in Signal shape select;
rise time input now enabled for both exp and linear modes
- Tests: riseShapeLinear unit tests + SPICE golden-reference comparison
against results-tline-oc.tsv (ngspice LTRA, TR=100ps, τ_d=1ns, open circuit),
validated to <0.1mV across all ~300 time points
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>