Avoid undefined behavior using CFlatData in CScript serialization
&vch[vch.size()] and even &vch[0] on vectors can cause assertion
errors with VC in debug mode. This is the problem mentioned in #4239.
The deeper problem with this is that we rely on undefined behavior.
- Add begin_ptr and end_ptr functions that get the beginning and end pointer of vector in a reliable way that copes with empty vectors and doesn't reference outside the vector
- Add a convenience constructor to CFlatData that wraps a vector.
I added begin_ptr and end_ptr as separate functions as I imagine
they will be useful in more places.