program: add orc_program_append_str_n

Add a new API which generalizes orc_program_append_str_2 which
* supports any number of operands for the givne opcode
* reports the status of the operation

most notably, in case of unknown operand, the new API signals
the wrong operand.
utils: add utility dynamic array

Add utility code to handle a dynamic array.
Supported operations:
* append an item
* grow the array
* get an item
* get the length of the array
* check if the array has any data on it.

There are clear use cases for this utility in the OrcParser,
but may be useful elsewhere as well.
parser: cleanup: use OrcVector to store programs
parser: move init_function in the parser
parser: new API with better error reporting

Add orc_parse_code with more detailed error reporting
* more detailed error reporting, both machine and human friendlier.
* collect errors only if asked to.
* preserve backward compatibility with orc_parse_full.
parser: reorder and rename for consistency

minor internal cleanup
* put public APIs on top.
* rename internally for consistency.
parser: reformat orc_parse_sanity_check
parser: extract initialization function
parser: add has_data helper

to check if a parser has still data to process
parser: switch to orc_program_append_str_n

For better error reporting.
parser: simplify the line handling

Make the code more regular and do a little cleanup.
parser: introduce line handling utility: OrcLine

to extract and simplify the line handling logic.
parser: rewrite line tokenization code

Make the tokenization a separate function, leveraging the OrcLine
struct.
parser: add is_directive helper

To improve encapsulation
parser: extract a function to handle opcodes
parser: extract a function to handle directives
parser: make directive handling extensible

Reformat the code for easier future extensions.
parser: extract function to handle .function
parser: extract function to handle .init
parser: extract function to handle .flags