Benchling Data Frame API
`DataFrame` stores non-schematized tabular data, with Benchling-aware column types (see `DataFrameColumn`). Data frames are not searchable and lack their own permissions; rather, they are child objects of pipelines (via `PipelineStepData`), datasets (see `Dataset`), and app canvases. Row data is stored in S3. Data frames are immutable; if data is updated, a new `DataFrame` is created.